Multithreading 什么';阻塞与同步、非阻塞和异步的区别是什么?

Multithreading 什么';阻塞与同步、非阻塞和异步的区别是什么?,multithreading,io,operating-system,blocking,synchronous,Multithreading,Io,Operating System,Blocking,Synchronous,我正在读“Java操作系统概念”。我对这个概念感到很困惑 阻塞和同步,它们之间有什么区别?同步意味着工作是在调用函数的线程中完成的,方法在完成之前不会返回 异步方法立即返回,因为另一个线程执行该工作,并在该工作完成时引发标志或触发事件 阻塞意味着执行阻塞事件的线程将等待事件发生。例如,您尝试从套接字读取数据,但没有一个会向您发送消息。在消息从套接字中恢复之前,阻止调用不会返回 非阻塞意味着与阻塞相反,意味着非阻塞调用是异步的。阻塞可能与同步相同,也可能不同,这取决于上下文。当我们讨论方法调用时,

我正在读“Java操作系统概念”。我对这个概念感到很困惑
阻塞和同步,它们之间有什么区别?

同步意味着工作是在调用函数的线程中完成的,方法在完成之前不会返回

异步方法立即返回,因为另一个线程执行该工作,并在该工作完成时引发标志或触发事件

阻塞意味着执行阻塞事件的线程将等待事件发生。例如,您尝试从套接字读取数据,但没有一个会向您发送消息。在消息从套接字中恢复之前,阻止调用不会返回


非阻塞意味着与阻塞相反,意味着非阻塞调用是异步的。

阻塞可能与同步相同,也可能不同,这取决于上下文。当我们讨论方法调用时,同步调用也可以说是阻塞的(稍后我会回到这里),因为调用方法的线程在方法返回之前无法继续进行。本例中的反义词是异步的

在锁术语中,如果等待获取锁的线程处于挂起模式,直到锁可用(或直到超时过去),则称锁为阻塞。本例中的反义词是非阻塞锁,这意味着线程即使无法获得锁也会立即返回。这可以用来实现所谓的旋转锁,即在保持线程活动的同时保持轮询锁的状态


说到这里,您可以推断出这两个概念之间的区别:同步通常意味着在线程向前移动之前必须等待回复的活动。阻塞是指线程处于等待状态的事实(通常意味着在某些事件发生之前它不会被安排执行)。从这里您可以得出结论,同步调用可能涉及阻塞行为,也可能不涉及阻塞行为,这取决于底层实现(即,它也可能是旋转的,这意味着您正在用异步调用模拟同步行为)

我将它们分类如下:

阻塞-线程将等待操作直到成功或失败(突出显示“将等待”,失败通常是超时)

同步-线程将在到达任何一行之前完成操作,无论是成功还是失败(在操作完成时突出显示)

非阻塞-线程不会等待完成操作,而是立即执行操作

异步-另一个线程(逻辑或物理)将使用回调完成操作或通知它已准备就绪,在执行以下命令之前不会等待。
注意:从这里开始命名asynchronous,因为您无法确定命令将以何种顺序执行

阻塞-如果操作等待某个事件完成,则称其具有阻塞行为。例如:如果锁不可用,线程可能会在事件上进入等待状态,直到锁可用。这样的操作被称为阻塞

同步-通过http协议的一个示例,可以很容易地理解同步调用,在该示例中,客户端等待服务器的回复,然后继续。同步调用可以是阻塞或非阻塞

异步-一个方法可以异步调用另一个方法。调用后,它可以继续执行下一条指令。当被调用的方法完成执行时,它将向调用方方法发送一个关于其成功或失败的回复/回调

非阻塞-非阻塞行为类似于检查该实例的条件。例如,在锁的情况下,如果它不可用,它不会像阻塞操作一样等待它可用。此外,我们还需要反复检查锁的可用性,因为不会有类似异步调用的回调

总结: 阻塞总是同步的

同步调用有阻塞操作,如果它等待某个事件完成,调用方方法可能会进入等待状态

如果同步调用在继续执行下一条指令之前反复检查某个事件是否发生,则该调用是非阻塞的。调用方方法未在某些事件上进入等待状态以完成


异步调用不能被阻塞,它涉及到来自被调用方法的回调,该方法需要处理

克洛诺斯泰铢。同步和阻塞似乎没有区别,它们都需要等待一个工作或事件完成,然后才能继续执行下一个工作或事件。是吗?请参考这个博客,嗨,你能举一个阻塞调用不同步的例子吗?Thanks@Always_Beginner:根据定义,阻塞调用将始终是同步的,因为它意味着控制流在等待某些内容完成时阻塞。然而,同步调用可能不会阻塞。如果我将wait放在异步调用上,这不会使它阻塞吗?这(尽管Python中有示例)与您关于异步不能阻塞和同步总是阻塞的陈述相矛盾。