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. Spring 事务传递教程_有实例

    通过这篇文章,你将学习到Spring框架中中事务的传递 简介 在处理Spring管理的事务时,开发人员可以以传播的方式定义事务的行为.换句话说,开发人员能够决定业务方法如何被封装在逻辑和物理事务中.来 ...

  2. 关于MySQL的SLEEP(N)函数

    都知道通过在MySQL中执行select sleep(N)可以让此语句运行N秒钟: ? 1 2 3 4 5 6 7 mysql> select sleep(1); +----------+ | ...

  3. asp.net cache 缓存

    就是希望让Web应用程序从一开始运行到结束都一直存在,有人就说为什么不用Application呢?其实Cache是可以一段时间内自动更新数据的,而Application就无法做成这样的,另外Appli ...

  4. gvim如何显示html属性代码提示? vim 如何显示 javascript属性及方法提示?

    gvim如何显示html属性代码 可以在vim中 显示 html, css, js等的属性/方法 提示: 一是: 在 ~/.vim/after/syntax/ 目录中 安装 css-color.vim ...

  5. vim的寄存器和剪贴簿操作?

    vim 复制/ 删除 多行? 有确定序号的行: :10,15m20, 10,15co20 没有确定序号的行: ndd, nyy. 其中的n表示, 从当前行开始算起(当前行本身要包含!!!), 向下共删 ...

  6. 梳理javascript原型整体思路

    相信很多对javascript原型初步了解的人都知道prototype,constructor,__proto__这些名词,也在一定程度上可以使用这些对象.属性.甚至知道在构造函数的原型上定义方法供实 ...

  7. 有利于SEO优化的DIV+CSS的命名规则小结

    可以先去这里温习一下CSS和HTML的知识!DIV+CSS规范命名大全集合  CSS开发技巧整理 一.CSS文件及样式命名 1.CSS文件命名规范 全局样式:global.css/master.css ...

  8. 设置p标签自动换行

    <body>     <p style="width:20px;height:100px;background-color:#069; word-wrap: break-w ...

  9. WebStorm设置编辑器中的字体大小

    启动webStorm之后,点击“FIle"菜单,选择其下的”Settings" 2.在左侧的菜单中选择“Editor/Colors & Fonts/Font 在右侧Sche ...

  10. 安卓手机当Mac、Win和Linux外置WIFI网卡

    Android手机都有USB共享网络的功能 ,利用此功能可以将网络共享给电脑 基本原理: 手机连接WIFI,开启USB网络共享,mac笔记本上网 (两款手机示意图) 博主实践证明: win10与Ubu ...