阻塞 、非阻塞;同步、异步
同步、异步、阻塞、非阻塞都是和IO(输入输出)有关的概念。最简单的文件读取就是IO操作。而在文件读取这件事儿上,可以有多种方式。
什么是同步和异步
同步请求,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
所以说,同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。
什么是阻塞和非阻塞
阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。
非阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。
所以说,阻塞非阻塞最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不做。非阻塞指的是调用方先去忙别的事情。
阻塞、非阻塞和同步、异步的区别
首先,前面已经提到过,阻塞、非阻塞和同步、异步其实针对的对象是不一样的。阻塞、非阻塞说的是调用者,同步、异步说的是被调用者。
有人认为阻塞和同步是一回事儿,非阻塞和异步是一回事。但是这是不对的。
Java中的三种IO模型
在Java语言中,一共提供了三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)、异步IO(AIO)。
这里面的BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO,异步IO指的是异步非阻塞IO。
BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。
AIO (Asynchronous I/O):异步非阻塞I/O模型。
举例:
BIO (Blocking I/O):有一排水壶在烧开水,BIO的工作模式就是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。
NIO (New I/O):NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
AIO ( Asynchronous I/O):为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。
Java中的IO还是借助操作系统的IO模型的,只不过是对操作系统IO模型的封装而已。
更多精彩,微信扫一扫:
原文:https://mp.weixin.qq.com/s?__biz=MzU4NzkwNTMzMg==&mid=2247483902&idx=2&sn=835c5edc9478a2d2e91575fcc302dfba&chksm=fde5a1a5ca9228b3d583d359e3d48e01d7b2296e924d6c10c426b8f01299923522c61bb3c995&mpshare=1&scene=23&srcid=&sharer_sharetime=1569287484750&sharer_shareid=570a2ed1c2a256d708a76b434f2d7246#rd