同步、异步、阻塞与非阻塞之间的关系

本文深入解析同步、异步、阻塞与非阻塞的概念及其在I/O操作中的应用,通过对比不同模型的特点,帮助理解NIO及异步操作机制。

同步、异步、阻塞与非阻塞之间的关系

同步、异步、阻塞与非阻塞可以组合成以下4种排列:

  1. 同步阻塞
  2. 同步非阻塞
  3. 异步阻塞
  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操作其实分成了两个步骤:

  1. 发起I/O请求;
  2. 实际的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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值