原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11444349.html

BIO

传统的java.io包,它基于流模型实现,提供了我们最熟知的一些IO功能,比如File抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。

java.io包的好处是代码比较简单、直观,缺点则是IO效率和扩展性存在局限性,容易成为应用性能的瓶颈。

很多时候,人们也把java.net下面提供的部分网络API,比如Socket、ServerSocket、HttpURLConnection也归类到同步阻塞IO类库,因为网络通信同样是IO行为。

NIO

在Java 1.4中引入了NIO框架(java.nio包),提供了Channel、Selector、Buffer等新的抽象,可以构建多路复用的、同步非阻塞IO程序,同时提供了更接近操作系统底层的高性能数据操作方式。

NIO的主要组成部分

  • Buffer,高效的数据容器,除了布尔类型,所有原始数据类型都有相应的Buffer实现。

  • Channel,类似在Linux之类操作系统上看到的文件描述符,是NIO中被用来支持批量式IO操作的一种抽象。

    File或者Socket,通常被认为是比较高层次的抽象,而Channel则是更加操作系统底层的一种抽象,这也使得NIO得以充分利用现代操作系统底层机制,获得特定场景的性能优化,例如,DMA(Direct Memory Access)等。不同层次的抽象是相互关联的,我们可以通过Socket获取Channel,反之亦然。

  • Selector,是NIO实现多路复用的基础,它提供了一种高效的机制,可以检测到注册在Selector上的多个Channel中,是否有Channel处于就绪状态,进而实现了单线程对多Channel的高效管理。

  • Charset,提供Unicode字符串定义,NIO也提供了相应的编解码器等

其中Selector同样是基于底层操作系统机制,不同模式、不同版本都存在区别,例如,在最新的代码库里,相关实现如下:

Linux上依赖于epoll(http://hg.openjdk.java.net/jdk/jdk/file/d8327f838b88/src/java.base/linux/classes/sun/nio/ch/EPollSelectorImpl.java

NIO则是利用了单线程轮询事件的机制,通过高效地定位就绪的Channel,来决定做什么,仅仅select阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来的问题,应用的扩展能力有了非常大的提高。

AIO

在Java 7中,NIO有了进一步的改进,也就是NIO 2,引入了异步非阻塞IO方式,也有很多人叫它AIO(Asynchronous IO)。异步IO操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

Reference

https://time.geekbang.org/column/article/8369

最新文章

  1. sed命令使用详解归纳
  2. Protobuf - 使用scons编译proto文件
  3. Mac os x下配置nginx + php
  4. 《TCP/IP详解 卷一》读书笔记-----DNS
  5. JavaScript 一些基础练习
  6. 从浏览器的console获取angularjs的scope
  7. ubuntu创建用户
  8. Git教程之标签管理
  9. ecshop模板修改后还原的原因
  10. AES - Rijndael 算法(一)
  11. 类作为返回类型 ,具有java特点-封装等 而且应用起来很方便。
  12. Linux环境下安装Redis步骤即问题解决
  13. 搭建NDK环境
  14. bat修改密码
  15. 一个简单的小小记账本程序(java)
  16. Python练习:哥德巴赫猜想
  17. UVA1646-Edge Case(递推+斐波那契数列)
  18. linux下安装svn服务器
  19. P4099 [HEOI2013]SAO
  20. 杂项:SQLite

热门文章

  1. /etc/init.d# ./redis-server start
  2. Understanding ECMAScript 6 阅读问题小记
  3. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_01 Collection集合_4_Iterator接口介绍
  4. spring boot 1.5.10.RELEASE ,spring boot admin 1.5.7 添加 security
  5. 【MM系列】SAP 主要模块及简介
  6. 使用gitlab的webhook进行前端自动部署
  7. ODBC Driver Development
  8. 解决浏览器打开网页后提示“dns_probe_possible”的方法
  9. 多线程06-Lock
  10. SpringBoot-Vue实现增删改查及分页小DEMO