1. 同步与异步

同步和异步主要关注的是消息通知机制。

同步调用发出后,调用者需要一直等待返回消息通知后,才能继续执行。 —  主动获取消息(消息通知)

异步调用发出后,调用者不能立即获得返回消息,立即返回完成调用,直到被调用者在完成后,通过状态、通知或回调来通知调用者。 — 被通知获取消息(消息通知)

2. 阻塞与非阻塞

阻塞和非阻塞主要关注的是线程等待消息通知时的状态。

阻塞调用发出后,调用者(当前线程)会被挂起,需要一直进行等待消息通知,中间不能执行其他业务,等待消息收到后才进行返回。 — 线程挂起(状态)

非阻塞调用发出后,调用者(当前线程)不会被阻塞挂起,而是立即返回。 — 线程不被挂起(状态)

3. 场景

w同学去书店买《Java从入门到放弃》这本书,问老板是否有书,然后老板在书店里面寻找………………

1. 同步阻塞:w同学一直在书店乖乖的等着,期间什么事都不做,直到老板告诉他结果

同步:等待现场通知

阻塞:等待通知过程中,期间什么事都不做,(状态:执着的死等)

2.同步非阻塞:w同学询问后就出去浪了,然后每一段时间来店里询问一下,直到老板告诉他结果

同步:等待现场通知

非阻塞:等待通知过程中,出去浪一圈,做别的事情,再回来询问消息(状态:半灵活)

3.异步阻塞:w同学询问后,给老板留了电话,就回家了,但是在家啥也不干就抱着手机等书店老板电话。

异步:等待电话通知

阻塞:等待电话通知的过程中,啥也不干(状态:很傻的死等)

4.异步非阻塞:w同学询问后,给老板留了电话,回家后该干什么就干什么,直到老板打电话过来。

异步:等待电话通知

非阻塞:等待电话通知的过程中,可以做其他的事情,只需要等电话通知(状态:灵活)

4.总结

同步与异步关注消息的通知机制,阻塞与非阻塞关注等待消息通知时的状态。同步状态,需要调用者自己去等待消息通知,异步状态,需要触发机制来通知调用者(如:回调)