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模型的简单说明的更多相关文章

  1. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...

  2. java线程内存模型,线程、工作内存、主内存

    转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...

  3. spring 第一篇(1-1):让java开发变得更简单(下)转

    spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...

  4. Java虚拟机内存模型及垃圾回收监控调优

    Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...

  5. Java I/O 模型的演进

    什么是同步?什么是异步?阻塞和非阻塞又有什么区别?本文先从 Unix 的 I/O 模型讲起,介绍了5种常见的 I/O 模型.而后再引出 Java 的 I/O 模型的演进过程,并用实例说明如何选择合适的 ...

  6. Java 网络 IO 模型

    在进入主题之前先看个 Java 网络编程的一个简单例子:代码很简单,客户端和服务端进行通信,对于客户端的每次输入,服务端回复 get.注意,服务端可以同时允许多个客户端连接. 服务端端代码: // 创 ...

  7. Java网络编程和NIO详解3:IO模型与Java网络编程模型

    Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...

  8. OSGI 面向Java的动态模型系统

    OSGI (面向Java的动态模型系统) OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSG ...

  9. Java I/O模型从BIO到NIO和Reactor模式(转)

    原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自技术世界,原文链接 http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 ...

随机推荐

  1. 发布自己的包到Nuget上

    1.首先下载Nuget.exe https://dist.nuget.org/index.html 2.设置环境变量  设置apikey nuget setApiKey <my_api_key& ...

  2. 安装windows后重新修复grub2的引导

    前段时间,我的用的双系统windows8.1 + fedora 21 workstation,使用grub2引导fedora和windows8.1的启动.由于一些原因,导致我的windows8.1无法 ...

  3. 让我们一起学Node.js-文章列表

    新浪的博客最近不给力,只好在博客园落个窝.至此之后,技术随笔会在博客园以及新浪的博客上同时更新,如果新浪给力的话~~~ 如果你想看先前新浪博客上分享的技术,请点击此处 忘尘子新浪博客! 我是拜读了朴灵 ...

  4. Linq to sql 的语法

    Linq to SQL 语法查询(子查询 & in操作 & join ) 引用地址:http://www.cnblogs.com/82767136/articles/2949541.h ...

  5. Tomcat 6.0 简介

    本片翻译来自:http://tomcat.apache.org/tomcat-6.0-doc/introduction.html 介绍 无论是开发者还是tomcat管理员在使用前都需要了解一些必要的信 ...

  6. windows2003最详细的安装操作步骤.(最详细)

    以下为windows2003的安装操作步骤,由于安装操作步骤较多,安装可能需要一定的实际安装经验.安装时请参照此文档一步步完成安装. 一.首先准备好Windows2003安装光盘CD1,将CD1光盘放 ...

  7. ASP FORM表单提交判断

    ASP提交表单是先进行Form填写检测,检测完成没问题之后再执行写入数据库表操作. 相关源码: <script language="javascript"> funct ...

  8. SQL补充

    TOP 子句TOP 子句用于规定要返回的记录的数目.对于拥有数千条记录的大型表来说,TOP 子句是非常有用的.注释:并非所有的数据库系统都支持 TOP 子句.SELECT TOP 2 * FROM P ...

  9. Swift2.1 语法指南——泛型

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  10. Android 实现简单音乐播放器(二)

    在Android 实现简单音乐播放器(一)中,我介绍了MusicPlayer的页面设计. 现在,我简单总结一些功能实现过程中的要点和有趣的细节,结合MainActivity.java代码进行说明(写出 ...