java nio 与 nio 的关系

以前遇到问题,总是可以在网上找到绝对正确的答案,现在遇到的很多问题,博客上会有很多种不同的答案,比如说关于java nio,有人说是同步非阻塞,还有人说是异步阻塞,我只知道java nio是采用的reactor模式,也可以说是io多路复用,netty也是这种方式。希望大鸟们可以给我一个详细的解释,关于java nio与linux nio,在此谢过大家

阅读 3.6k
2 个回答

首先我想说下我对 同步异步 阻塞非阻塞的理解:
同步异步 指的是线程在处理一件事的时候,能不能去处理另外一件事,然后过一会再给上一件事结果
阻塞非阻塞 指的是线程在处理一件事的时候,会不会被阻塞住 (linux 里的NIO 意思就是no block io)
这在java 等编程语言里 ,应该是一种编程模型,

而在linux 的IO模型里 ,这种表述就不成立 ,因为不管什么IO模型,在从内核复制到用户态的过程 中都是阻塞的,即使是 同步非阻塞模型,
在linux 模型中,阻塞非阻塞指的是 使用系统调用看用户态准备好没有这个过程 ,而对于linux多路复用,系统调用select也阻塞,也没有办法去做别的任务,看起来他应该是同步阻塞,但他却比linux的同步阻塞要好得多,
因为同步阻塞模型是对一个IO ,而多路复用是对多个IO,
关于linuxIO模型 : https://www.jianshu.com/p/486...

我之前也纠结过同步非阻塞和异步非阻塞的事情,但是后来想了想,这个东西要从不同的层面看,就拿netty来说,从整体来看,是属于异步非阻塞,accept的线程处理完请求,交给后面的reactor,
那accept的线程不就去处理别的请求了,这不就达到了异步非阻塞,但他内部reactor 使用的是多路复用模型 而不是 真正的 异步非阻塞模型,

所以说了这么多,其实还是想表达 同步异步,阻塞非阻塞 ,只是一种编程思路,不用去纠结,也不要被linux的IO模型搞混了,

还有就是java的NIO 是 new IO 的意思,不是noblock io ,因为他除了提供selector之外,还有其他的io特性提供,比如大文件的处理

推荐你看 Netty权威指南 第2版 上面写的非常清晰

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题