Java 同步与异步-阻塞与非阻塞理解

Posted 便当君(小白)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 同步与异步-阻塞与非阻塞理解相关的知识,希望对你有一定的参考价值。

Java 同步与异步-阻塞与非阻塞理解

Java 中同步与异步,阻塞与非阻塞都是用来形容交互方式,区别在于它们描述的是交互的两个不同层面。

同步与异步

同步与异步更关注交互双方是否可以同时工作。以同步的方式完成任务意味着多个任务的完成次序是串行的,假设任务 A 依赖于任务 B,那么任务 A 必须等到任务 B 完成之后才能继续,执行流程为 A->B;以异步的方式完成任务意味着多个任务的完成可以是并行的,这种情况多适用于任务之间没有因果关系,假如任务 A 中需要执行任务 B,而任务 A 的完成不依赖于任务 B 的结果,那么任务 A 调用任务 B 后可以继续执行后续步骤而不需要等待任务 B 完成,也不关心任务 B 是否执行完毕,此时任务 A 和任务 B 是并行的。

为了加深对同步和异步的理解,可以使用打电话和发短信的类别同步和异步的交互方式。打电话时,一方的后续操作必须等到另一方说完才能进行,这种交互方式就是同步的。发短信则意味着我们不关心对方看到短信后的结果,我们关心自己是否发了短信,发完短信后,我们可以接着手头上的工作,这种交互方式就是异步的。

阻塞与非阻塞

阻塞与非阻塞关注的是交互双方是否可以弹性工作。假设对象 A 和对象 B 进行交互,而对象 B 对一个问题需要思考一段时间才能回复 A,那么对象 A 可以选择等待对象 B 回复,这种方式就是一种阻塞式交互,与此同时,对象 A 可以选择在对象 B 进行思考的时间去完成别的工作,等到对象 B 完成思考后再进行后续交互,这种方式就是一种非阻塞式的交互。

一般来说,阻塞与非阻塞式用来形容 CPU 消耗的。我们把 CPU 停下来等待慢操作完成以后再接着工作称为阻塞;把 CPU 在慢操作完成之前去完成其他工作,等慢操作完成后再接着工作称为非阻塞。

以上是关于Java 同步与异步-阻塞与非阻塞理解的主要内容,如果未能解决你的问题,请参考以下文章

同步与异步阻塞与非阻塞理解

聊聊同步异步阻塞与非阻塞

同步与异步阻塞与非阻塞

同步与异步,阻塞与非阻塞

socket阻塞与非阻塞,同步与异步I/O模型

同步与阻塞,异步与非阻塞的区别(转)