对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

同步和异步

同步和异步其实是指CPU时间片的利用,主要看请求发起方对消息结果的获取是主动发起的,还是被动通知的,如下图所示。如果是请求方主动发起的,一直在等待应答结果(同步阻塞),或者可以先去处理其他事情,但要不断轮询查看发起的请求是否有应答结果(同步非阻塞),因为不管如何都要发起方主动获取消息结果,所以形式上还是同步操作。如果是由服务方通知的,也就是请求方发出请求后,要么一直等待通知(异步阻塞),要么先去干自己的事(异步非阻塞)。当事情处理完成后,服务方会主动通知请求方,它的请求已经完成,这就是异步。异步通知的方式一般通过状态改变、消息通知或者回调函数来完成,大多数时候采用的都是回调函数。

对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

 

阻塞和非阻塞

阻塞和非阻塞在计算机的世界里,通常指针对I/O的操作,如网络I/O和磁盘I/O等。那么什么是阻塞和非阻塞呢?简单地说,就是我们调用了一个函数后,在等待这个函数返回结果之前,当前的线程是处于挂起状态还是运行状态。如果是挂起状态,就意味着当前线程什么都不能干,就等着获取结果,这就是同步阻塞;如果仍然是运行状态,就意味着当前线程是可以继续处理其他任务的,但要时不时地看一下是否有结果了,这就是同步非阻塞。具体如下图所示

对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

 

阻塞I/O模型

对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

 

非阻塞I/O模型对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

多路复用I/O模型对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

从BIO到NIO的演进

对于同步和非同步,阻塞和非阻塞,BIO,NIO的概念的回顾

面向流与面向缓冲Java NIO和BIO之间第一个最大的区别是,BIO是面向流的,NIO是面向缓冲区的。Java BIO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程的灵活性。但是,还需要检查该缓冲区是否包含所有需要处理的数据。而且,要确保当更多的数据读入缓冲区时,不能覆盖缓冲区里尚未处理的数据。