From 0dd69b33ba38d24940bc34fe114e9e3f79dc372b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=9E=E7=BB=9D?= Date: Thu, 1 Nov 2018 11:03:11 +0800 Subject: [PATCH] add java nio info --- "Java\347\233\270\345\205\263/Java IO\344\270\216NIO.md" | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git "a/Java\347\233\270\345\205\263/Java IO\344\270\216NIO.md" "b/Java\347\233\270\345\205\263/Java IO\344\270\216NIO.md" index 905df527c40..b498cdfb3d0 100644 --- "a/Java\347\233\270\345\205\263/Java IO\344\270\216NIO.md" +++ "b/Java\347\233\270\345\205\263/Java IO\344\270\216NIO.md" @@ -196,5 +196,13 @@ Java7中新增了AsynchronousFileChannel作为nio的一部分。AsynchronousFile ### [Java AIO总结与示例](https://blog.csdn.net/x_i_y_u_e/article/details/52223406) AIO是异步IO的缩写,虽然NIO在网络操作中,提供了非阻塞的方法,但是NIO的IO行为还是同步的。对于NIO来说,我们的业务线程是在IO操作准备好时,得到通知,接着就由这个线程自行进行IO操作,IO操作本身是同步的。 +## 一些知乎上的觉得讲解得比较准确的文章 +### [1](https://zhuanlan.zhihu.com/p/28539046) +### [2](https://zhuanlan.zhihu.com/p/29675083) + +同步/异步指的是真正io操作(数据从内核态用户态的拷贝)是否需要进程参与,就java nio读操作来说,如果接收到可读事件通知,具体的读操作还是需要应用进程参与的,见文章1的图 + +应用程序的一次io分成两个阶段,第一阶段是io请求,指的是应用程序通知操作系统我有io的意向,给我准备数据或者空间。第二阶段是io操作,指的是操作系统将io请求所需的数据或者空间已经准备好,可以进行真正的数据拷贝(数据在用户态内核态之间的拷贝)。 +阻塞非阻塞发生在io的第一阶段io请求时,当操作系统并没有将io请求所需的数据或者空间准备好时,io请求的线程是否等待来区分。如果线程等待直到io请求所需的资源准备好那么这个就是阻塞。如果线程不等待,那么就是非阻塞,那么不等待如何知道资源已经准备好啦呢?一种方式是轮询,一种方式就是通知。 **欢迎关注我的微信公众号:"Java面试通关手册"(一个有温度的微信公众号,期待与你共同进步~~~坚持原创,分享美文,分享各种Java学习资源):**