周末在家加班,正在疯狂的撸代码,女友很开心的跑过来,手里拿着他刚刚画好的一副漫画。
markdown
同步、异步、阻塞、非阻塞都是和IO(输入输出)有关的概念。最简单的文件读取就是IO操做。而在文件读取这件事儿上,能够有多种方式。
异步
说到烧水,咱们都是经过热水壶来烧水的。在好久以前,科技尚未这么发达的时候,若是咱们要烧水,须要把水壶放到火炉上,咱们经过观察水壶内的水的沸腾程度来判断水有没有烧开。spa
随着科技的发展,如今市面上的水壶都有了提醒功能,当咱们把水壶插电以后,水壶水烧开以后会经过声音提醒咱们水开了。线程
对于烧水这件事儿来讲,传统水壶的烧水就是同步的,高科技水壶的烧水就是异步的。3d
同步请求,A调用B,B的处理是同步的,在处理完以前他不会通知A,只有处理完以后才会明确的通知A。code
异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,而后异步去处理,处理完以后经过回调等方式再通知A。orm
因此说,同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方作完事情以后再返回,异步指的是被调用方先返回,而后再作事情,作完以后再想办法通知调用方。对象
仍是那个烧水的例子,当你把水放到水壶里面,按下开关后,你能够坐在水壶前面,别的事情什么都不作,一直等着水烧好。你还能够先去客厅看电视,等着水开就行了。同步
对于你来讲,坐在水壶前面等就是阻塞的,去客厅看电视等着水开就是非阻塞的。it
阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。
非阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。
因此说,阻塞和非阻塞最大的区别就是在被调用方返回结果以前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不作。非阻塞指的是调用方先去忙别的事情。
首先,前面已经提到过,阻塞、非阻塞和同步、异步其实针对的对象是不同的。阻塞、非阻塞说的是调用者,同步、异步说的是被调用者。
有人认为阻塞和同步是一回事儿,非阻塞和异步是一回事。可是这是不对的。
先来看同步场景中是如何包含阻塞和非阻塞状况的。
咱们是用传统的水壶烧水。在水烧开以前咱们一直作在水壶前面,等着水开。这就是阻塞的。
咱们是用传统的水壶烧水。在水烧开以前咱们先去客厅看电视了,可是水壶不会主动通知咱们,须要咱们时不时的去厨房看一下水有没有烧开。这就是非阻塞的。
再来看异步场景中是如何包含阻塞和非阻塞状况的。
咱们是用带有提醒功能的水壶烧水。在水烧发出提醒以前咱们一直作在水壶前面,等着水开。这就是阻塞的。
咱们是用带有提醒功能的水壶烧水。在水烧发出提醒以前咱们先去客厅看电视了,等水壶发出声音提醒咱们。这就是非阻塞的。
在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):为每一个水壶上面装了一个开关,水烧开以后,水壶会自动通知我水烧开了。
滴滴滴滴,这时候水壶响了,打断了女友的发问。女友去拿来烧好的热水,给我泡了一杯咖啡。