Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别

时间:2022-05-18 18:43:26

1. 同步:

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就必须先得到返回值了

换句话话说,调用者主动等待这个"调用"的结果。

对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已

2. 异步:

所谓异步,"调用"在发出之后,这个调用就直接返回了,所以没有返回结果

换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在"调用"发出后,"被调用者"通过状态通知来通知调用者,或通过回调函数处理这个调用

同步 和 异步 关注的是消息通信机制 (synchronous communication/ asynchronous communication),举个通俗的例子:

  你打电话问书店老板有没有《Java虚拟机》这本书,如果是同步通信机制,书店老板会说,你稍等,"我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
  而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

3. 阻塞式:

阻塞调用是指调用结果返回之前,当前线程会被挂起(线程阻塞)。函数只有在得到结果之后才会返回。

有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已

4. 非阻塞式:

非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

阻塞非阻塞 关注的是程序(线程)在等待调用结果(消息,返回值)时的 状态

你打电话问书店老板有没有《Java虚拟机》这本书,你如果是阻塞式调用,你会一直把自己"挂起",直到得到这本书有没有的结果;
如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。