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

我想念泉州的夏天了

原文聊聊同步、异步、阻塞与非阻塞用生动的例子解释同步非同步和阻塞非阻塞,看了之后豁然开朗,好文转发啊。哈哈。

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

1,选择排队等候;
2,另种选择取一个小纸条上面有我的号码,
等到排到我这一号时由柜台的人通知我轮到我去办理业务了;

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

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

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

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

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