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模型 同步 ...
随机推荐
- 发布自己的包到Nuget上
1.首先下载Nuget.exe https://dist.nuget.org/index.html 2.设置环境变量 设置apikey nuget setApiKey <my_api_key& ...
- 安装windows后重新修复grub2的引导
前段时间,我的用的双系统windows8.1 + fedora 21 workstation,使用grub2引导fedora和windows8.1的启动.由于一些原因,导致我的windows8.1无法 ...
- 让我们一起学Node.js-文章列表
新浪的博客最近不给力,只好在博客园落个窝.至此之后,技术随笔会在博客园以及新浪的博客上同时更新,如果新浪给力的话~~~ 如果你想看先前新浪博客上分享的技术,请点击此处 忘尘子新浪博客! 我是拜读了朴灵 ...
- Linq to sql 的语法
Linq to SQL 语法查询(子查询 & in操作 & join ) 引用地址:http://www.cnblogs.com/82767136/articles/2949541.h ...
- Tomcat 6.0 简介
本片翻译来自:http://tomcat.apache.org/tomcat-6.0-doc/introduction.html 介绍 无论是开发者还是tomcat管理员在使用前都需要了解一些必要的信 ...
- windows2003最详细的安装操作步骤.(最详细)
以下为windows2003的安装操作步骤,由于安装操作步骤较多,安装可能需要一定的实际安装经验.安装时请参照此文档一步步完成安装. 一.首先准备好Windows2003安装光盘CD1,将CD1光盘放 ...
- ASP FORM表单提交判断
ASP提交表单是先进行Form填写检测,检测完成没问题之后再执行写入数据库表操作. 相关源码: <script language="javascript"> funct ...
- SQL补充
TOP 子句TOP 子句用于规定要返回的记录的数目.对于拥有数千条记录的大型表来说,TOP 子句是非常有用的.注释:并非所有的数据库系统都支持 TOP 子句.SELECT TOP 2 * FROM P ...
- Swift2.1 语法指南——泛型
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Android 实现简单音乐播放器(二)
在Android 实现简单音乐播放器(一)中,我介绍了MusicPlayer的页面设计. 现在,我简单总结一些功能实现过程中的要点和有趣的细节,结合MainActivity.java代码进行说明(写出 ...