Java I/O模型的简单说明
1、同步和异步
同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行,最简单的例子就是顺序的执行两个方法,当第一个方法正在执行时,那么第二个方法需要等待第一个方法执行完毕后才能继续执行
异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待,在Java中最常见的就是多线程来实现异步,执行一个方法的同时,开另外一个线程同时执行其他事情
2、阻塞和非阻塞
阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,但是由于该请求操作需要的条件不满足,那么就会一直在那等待,直至条件满足,比如实现一个功能是读取指定目录下的文件的内容,如果文件不存在,那么程序将无限循环的进行读取,比如每隔3s继续读一次,就好像服务器一样一直在后台以服务形式运行着
非阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,如果该请求操作需要的条件不满足,会立即返回一个标志信息告知条件不满足,不会一直在那等待,比如也是读取一个目录下指定文件,如果文件读取到,则返回文件的内容给程序,如果不存在则返回相应的状态,这段程序到这里就执行完毕了
同步、异步和阻塞、非阻塞之间没有必然联系,更不能划等号,
3、阻塞IO和非阻塞IO
IO操作包括对硬盘的文件读写,对socket的读写和对外部输入输出设备的操作
当用户调用程序发起一个IO的操作,比如通过socket接收请求的数据,内核会去查看要读取的数据是否就绪,对于阻塞IO,如果没有就绪,读取进程会一直等待,直到数据就绪;对于非阻塞IO,如果数据没有就绪,则会返回标志信息告知用户线程当前要读的数据没有就绪;当数据就绪后内核会将数据拷贝到用户线程
4、同步IO和异步IO
同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;
异步IO:只有IO请求操作的发出是由用户线程来进行的,IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。
从上面来看,同步IO和异步IO是针对用户线程和内核的交互来区分的,关键所在就是数据拷贝阶段是内核完成,还是用户线程完成,异步IO必须依靠操作系统支持才可以
常用的5种IO模型有:阻塞IO模型、非阻塞IO模型、多路复用IO模型、信号驱动IO模型、异步IO模型
阻塞IO模型:最传统的IO模型,简单说来就是:数据没有就绪,线程一直处于阻塞状态,其他线程无法进行
非阻塞IO模型:无需等待,数据未就绪,返回一个错误的标识,让用户知道数据还没有准备好,还可以适时发送下一个请求
多路复用IO模型:目前使用的比较多,Java NIO就是多路复用的,线程会不断轮询读取socket状态,只有当socket有读写事件时,才真正调用实际的IO读写操作,只需要一个线程就可以管理多个socket,资源占用非常小;但是如果响应的信息量非常大,那么事件处理延时较长,会对性能有一定影响
信号驱动IO模型:当用户发起一个IO请求,会给socket注册一个信号函数,然后用户线程继续向下执行另外的操作,当内核就绪时会发送一个信号给线程,线程收到之后,就可以使用信号函数调用IO进行实际的读写操作
异步IO模型:这个算是最理想的IO模型,当用户线程发起IO请求操作之后,立刻就开始做其他事,内核收到asynchronous操作之后,会等待数据准备完成,然后将数据拷贝到用户线程,当这些操作完成之后,内核会给线程发送一个信号,告诉他请求操作完成了,用户线程完全不必关心整个IO操作是如何进行的,只需要发送一个请求,这些事就交给内核来做了,当线程收到内核返回的成功信号时,直接使用数据就可以了;整个过程是完全并行进行的,两个阶段都不会阻塞用户线程,异步IO需要操作系统底层的支持,从Java 7开始就支持Asynchronous IO了
上面5种模型中,前四种模型本质上都会对用户线程产生阻塞,实际上都属于同步IO,只有最后一种是真正的异步IO,因为用户线程不必要读取数据所以不会产生阻塞,线程和内核两个任务是并发的,这样才是理想的异步操作
基于以上的IO模型,在网络服务设计模式中,有两种比较经典的模式就是多线程和线程池,网络编程中的Reactor和Proactor实际上就是同步IO和异步IO的多路复用模式
Java I/O模型的简单说明的更多相关文章
- Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...
- java线程内存模型,线程、工作内存、主内存
转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...
- spring 第一篇(1-1):让java开发变得更简单(下)转
spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...
- Java虚拟机内存模型及垃圾回收监控调优
Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...
- Java I/O 模型的演进
什么是同步?什么是异步?阻塞和非阻塞又有什么区别?本文先从 Unix 的 I/O 模型讲起,介绍了5种常见的 I/O 模型.而后再引出 Java 的 I/O 模型的演进过程,并用实例说明如何选择合适的 ...
- Java 网络 IO 模型
在进入主题之前先看个 Java 网络编程的一个简单例子:代码很简单,客户端和服务端进行通信,对于客户端的每次输入,服务端回复 get.注意,服务端可以同时允许多个客户端连接. 服务端端代码: // 创 ...
- Java网络编程和NIO详解3:IO模型与Java网络编程模型
Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...
- OSGI 面向Java的动态模型系统
OSGI (面向Java的动态模型系统) OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSG ...
- Java I/O模型从BIO到NIO和Reactor模式(转)
原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自技术世界,原文链接 http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 ...
随机推荐
- SQL Server2008 with(lock)用法
参考资料: WITH (NOLOCK) 在sqlserver 中with(nolock)详解
- jquery 清除动画队列不疑惑
$(this).siblings().stop().fadeTo(200, 0.3); jquery动画存在一个队列, 会把事件产生的动画 放在一个队列中,当来不及执行这些事件队列的时候,会在事件结束 ...
- JS URL传递中文参数时出现乱码的处理
在浏览器中显示的地址是这样的: 但是按F12调试的时候的地址却变化掉了: 这个肯定是是因为浏览器对url路径默认编码了.这个问题是在我们去取值的时候,得到的就是后面那一大串稀奇古怪的东西.得不到我们想 ...
- CSS浮动属性Float介绍
#cnblogs_post_body h6 {font-size: 16px;font-weight: bold;} 什么是CSS Float? float 是 css 的定位属性.在传统的印刷布局中 ...
- QT连接Linux mysql注意
windows: #define MYSQLDB "QMYSQL"#define MYSQLDB_HOSTNAME "192.168.228.168"#defi ...
- HDOJ 4751 Divide Groups
染色判断二分图+补图 比赛的时候题意居然是反的,看了半天样例都看不懂 .... Divide Groups Time Limit: 2000/1000 MS (Java/Others) Memo ...
- 怎样更改wordpress登陆 URL防止恶意注册
WP 默认的登陆 URL 是 wp-login.php或wp-admin.php,许多spamer会根据这些footprint来收集可注册的wordpress站点,然后你的站内就多出许多垃圾评论.如果 ...
- Hadoop 之面试题
颜色区别: 蓝色:hive,橙色:Hbase.黑色hadoop 请简述hadoop怎样实现二级排序. 你认为用Java,Streaming,pipe 方式开发map/reduce,各有哪些优缺点: 6 ...
- redis--key1
package com.ztest.redis; import java.util.Set; import com.sun.istack.internal.logging.Logger; import ...
- NFS工作原理及配置文件详解
nfs工作原理流程 如上图所示,当访问程序通过NFS客户端向NFS服务端存取文件时,其请求数据流程如下几点: 1.首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能 ...