2018-07-08-java-同步异步和阻塞非阻塞

世间千般好


分类 java
标签 java 线程

同步异步例子:去银行办业务

  • 同步:选择排队等候
  • 异步:到取号处取个号码,然后坐在椅子上等待,由柜台的人叫号来通知我去办理业务

阻塞非阻塞例子:在银行办业务过程中

阻塞:不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息通知之外不能做其它的事情,那么该机制就是阻塞的,表现在程序中就是该程序一直阻塞在该函数调用处不能继续往下执行。

非阻塞:相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待。

但需要注意,同步非阻塞形式实际上是效率低下的,想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有。如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;

而异步非阻塞形式却没有这样的问题,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

参考