同步、异步、阻塞、非阻塞总结

本文对于同步、异步、阻塞和非阻塞等概念进行总结。


对于一个线程调用一个方法,同步异步说的是这个方法的返回方式,既方法和线程之间的通信机制,而阻塞非阻塞说的是这个线程在发起这个调用后的执行状态。

同步(Synchronization):这个方法在没有得到结果之前不返回,既等到方法执行完以后再返回。

异步(Asynchronization):这个方法被调用后立即返回,等到方法执行完后会通知线程来处理这个方法执行结果。

阻塞(Blocking):线程在调用这个方法后原地等待(挂起),等到这个方法返回后再继续执行。

非阻塞(Non-blocking):线程在调用这个方法后继续向下执行。

举一个例子:

小明想订一张机票,所以他给航空公司客服打电话。

如果客服是同步通信机制,那就就会告诉他,你等一会儿不要挂电话,查到结果以后告诉你。

如果客服是异步通信机制,那么就会告诉他,我现在会去查,我查到以后打电话通知你。

如果小明是阻塞式的,那么他在问完客服以后就什么都不干,一直等待,直到客服返回给他结果,他再进行处理。

如果小明是非阻塞式的,那么他在打完电话后就去干其他事,直到客服给他回电话时或者查到结果时,他再回来处理。

上面小明的状态和客服的状态两两组合就会出现四种模式:

同步阻塞:小明问完后拿着电话什么都不干等结果,客服查到结果后再告诉他。

同步非阻塞:小明问完后拿着电话干其他事,时不时检查一下客服是否返回结果。

异步阻塞:小明问完后挂了电话在电话前等待,什么都不做,客服查到结果后打电话通知他。

异步非阻塞:小明问完后挂了电话继续干其他事,客服查到结果后打电话通知他。

Node.js就使用异步非阻塞的I/O模型。