同步、异步、阻塞与非阻塞之间的关系
同步、异步、阻塞与非阻塞可以组合成以下4种排列:
- 同步阻塞
- 同步非阻塞
- 异步阻塞
- 异步非阻塞
在使用普通的InputStream、OutputStream 类时,就是属于同步阻塞,因为执行当前读写任务一直是当前线程,并且读不到或写不出去就一直是阻塞的状态。阻塞的意思就是方法.不返回,直到读到数据或写出数据为止。
NIO技术属于同步非阻塞。当执行“serverSocketChannel.configureBlocking(false)”代码后,也是一直由当前的线程在执行读写操作,但是读不到数据或数据写不出去时读写方法就返回了,继续执行读或写后面的代码。
而异步当然就是指多个线程间的通信。例如,A线程发起一个读操作,这个读操作要B线程进行实现,A线程和B线程就是异步执行了。A线程还要继续做其他的事情,这时B线程开始工作,如果读不到数据,B线程就呈阻塞状态了,如果读到数据,就通知A线程,并且将拿到的数据交给A线程,这种情况是异步阻塞。
最后一种是异步非阻塞,是指A线程发起一个读操作,这个读操作要B线程进行实现,因为A线程还要继续做其他的事情,这时B线程开始工作,如果读不到数据,B线程就继续执行后面的代码,直到读到数据时,B线程就通知A线程,并且将拿到的数据交给A线程。
从大的概念上来讲,同步和异步关注的是消息通信机制,阻塞和非阻塞关注的是程序在等待调用结果时的状态。文件通道永远都是阻塞的,不能设置成非阻塞模式。
首先一个I/O操作其实分成了两个步骤:
- 发起I/O请求;
- 实际的I/O操作。
同步I/O和异步I/O的区别就在于第二个步骤是否阻塞。如果实际的I/O读写阻塞请求进程,那么就是同步I/O。因此,阻塞I/O、非阻塞I/O、I/O 复用、信号驱动I/O都是同步I/O。如果不阻塞,而是操作系统帮用户做完I0操作再将结果返回给用户,那么就是异步I/O。
阻塞I/O和非阻塞I/O的区别在于第一步,即发起I/O请求是否会被阻塞。如果阻塞直到完成,那么就是传统的阻塞I/O;如果不阻塞,那么就是非阻塞I/O。
本文深入解析同步、异步、阻塞与非阻塞的概念及其在I/O操作中的应用,通过对比不同模型的特点,帮助理解NIO及异步操作机制。
503

被折叠的 条评论
为什么被折叠?



