聊一聊BIO、NIO

1、标准I/O

InputStream和OutputStream作用于字节流,Reader和Writer作用于字符流。

JDK1.4引入新的I/O类库,旧的I/O包已经使用nio重新实现过,以便充分利用这种速度提高。

通道和缓存。我们可以把它相像成一个煤矿,通道是一个包含煤矿(数据)的矿藏,而缓冲器则是派送到矿藏的卡车。也就是说,我们并不是直接和通道交互,而只与缓冲交互,并把缓冲派到通道,获取数据或发送数据。

不使用缓冲


使用缓冲

2、BIO

bio即block-I/O,同步阻塞式I/O

由代码可知,在while循环内服务端会调用accept方法等待接收客户端的连接请求,一旦一个请求连接,就可以建立通信套接字在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成,再进行下一次循环。此处可以使用线程池技术,提高并发,但随着连接的增多,将会消耗过多的内存资源,导致服务器变慢甚至崩溃。

3、NIO

nio即no-block I/O,同步非阻塞式IO

init操作是获取一个serverSocketChanel并注册到selector

run方法实际是对selector做遍历,监听事件(SelectionKey 有isReadable()、isWritable()、isConnectable()、isAcceptable())并处理。利用buffer作为程序与I/O的缓冲提高运行速度。

NIO较BIO的优势,通过selector轮询channel,选择就绪事件处理。当存在大量客户端连接请求时,服务器处理事件可以得到有效调控。

①客户端发起的连接请求是异步的,可以通过直接在多路复用器注册OP_CONNECT操作等待后续操作,不需要同步阻塞等待结果可用。

②SocketChannel的读写都是异步的,如果没有可读写的数据它不会同步等待,直接返回,这样IO通信线程可以处理其他链路,不要同步等待这个链路可用。

③线程模型的优化:由于JDK的Selector在Linux等主流OS中通过epoll实现,没有连接句柄数的限制,这意味着Selector线程可以同时处理成千上万的客户端连接,而且性能不会随着客户端的增加而线性下降,因此非常适合做高性能、高并发的网络服务器。

陈钊对这个过程在java bio,nio,aio及源码中讲解得还是比较清晰的。


参考:

1、《Java编程思想》

2、Java中的BIO与NIO的区别详解

3、java bio,nio,aio及源码

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也...
    闪电是只猫阅读 3,322评论 0赞 7
  • NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也...
    Demon_code阅读 498评论 0赞 0
  • 1. 前言 有一些概念总是Java I/O一块出现,比如同步与异步,阻塞与非阻塞,这些概念往往也是非常难以区分。在...
    WekingZhang阅读 631评论 0赞 2
  • 前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传...
    Java3y阅读 7,785评论 5赞 291
  • 上午 训练,下午又上课,中午被朋友拉去选壁纸,一直忙9点到家,洗完三套练功服,想起要先赶一篇领导讲话,不敢懈怠...
    一粒珍珠阅读 244评论 0赞 0

友情链接更多精彩内容