阻塞与同步,非阻塞和异步之间的区别是什么?

dil*_*ent 23 io multithreading operating-system synchronous blocking

我正在阅读'使用Java操作系统概念'.我对阻塞和同步的概念很困惑,它们之间有什么区别?

Tud*_*dor 22

阻止可能与同步相同或不同,具体取决于上下文.当我们谈论方法调用时,同样的调用也可以说是阻塞(我稍后会回到这里),因为调用方法的线程在方法返回之前无法继续进行.在这种情况下,反义词将是异步的.

在锁定术语中,如果等待获取它的线程被置于挂起模式直到锁变为可用(或直到超时),则称锁被阻塞.在这种情况下,反义词是一个非阻塞锁,这意味着即使它无法获取锁,线程也会立即返回.这可用于实现所谓的旋转锁定,您可以在保持线程活动的同时轮询锁定状态.

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

  • @Always_Beginner:根据定义,阻塞调用将始终是同步的,因为这意味着控制流在等待某事完成时阻塞。然而,同步调用可能不会阻塞。 (2认同)

小智 5

我将它们分类如下:

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

同步-线程将以成功或失败的方式完成操作,然后到达之后的任何行(操作完成时的突出显示)

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

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


小智 5

阻塞-如果操作等待某个事件完成,则该操作具有阻塞行为。例如:如果锁不可用,则线程可以在事件进入等待状态直到锁可用。据说这种操作是阻塞的。

同步-使用http协议的示例可以轻松理解同步调用,其中客户端等待来自服务器的答复然后继续进行。同步呼叫可以是阻塞的也可以是非阻塞的。

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

非阻塞-非阻塞行为就像检查该实例的条件。例如,在锁不可用的情况下,它不会像阻塞操作一样等到可用。另外,我们将需要反复检查锁的可用性,因为不会像异步调用那样发生回调。

摘要:阻塞始终是同步的。

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

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

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