一.问题引出
之前和朋友讨论多线程问题的时候,朋友问了一下阻塞和同步的区别,当时顿时懵逼了。这两个概念给人最直接的感受就是:阻塞也是等,同步也是等呀!好像没什么区别吧。
二.概念
阻塞和非阻塞都是通常用来形容多线程间的相互影响。比如一个线程占用了临界资源,那么其他所有需要这个临界资源的线程都要在临界区等待,等待或造成线程的挂起,这种情况就是阻塞。它会一直尝试做,直到完成。平常用到的锁基本上就是阻塞的。
非阻塞的意思和这个相反,它没有强调一个线程可以妨碍其他线程的执行。所有线程都不断向前执行。
同步和异步通常用来形容一个方法的调用,同步方法调用一但开始,调用者必须等到方法调用返回后,才能继续后续的行为。
异步方法调用更像一个消息传递,一但开始,方法调用就会立即返回,调用者可以进行后续的工作,之后会接到一个异步响应通知。比如future。
三 加深记忆
1.同步阻塞
跑去店里叫份肯德基,一直等到它做完再拿回来。
2.同步非阻塞
跑去店里叫份肯德基,一边刷微博一边问有没有做好。
3.异步阻塞
在网上叫了份肯德基,一直等骑手送过来。
4.异步非阻塞
在网上叫了份肯德基,刷微博等着骑手送来就好了。
现在好理解同步和阻塞了吧
再举一个例子
同步可以理解为师傅做饼,首先需要拿到面粉,然后才做饼。这个是有先后顺序的,后面需要前面的条件。
阻塞可以理解为过独木桥,桥对面的两个人可以是两个独立的线程,只要有人过了桥,下一个才能过。