我正在阅读'使用Java操作系统概念'。我很困惑的概念 阻塞和同步,它们之间有什么区别?
答案 0 :(得分:20)
阻止可能与同步相同,也可能不同,具体取决于上下文。当我们谈论方法调用时,同样的调用也可以说是阻塞(我稍后会回到这里),因为调用方法的线程在方法返回之前无法继续进行。在这种情况下,反义词将是异步的。
在锁定术语中,如果等待获取它的线程被置于挂起模式直到锁变为可用(或直到超时),则称锁被阻塞。在这种情况下,反义词是一个非阻塞锁,这意味着即使它无法获取锁,线程也会立即返回。这可以用于实现所谓的旋转锁定,在这种情况下,您可以在保持线程处于活动状态的同时轮询锁定状态。
话虽如此,您可以推断出概念之间的差异:同步通常意味着在线程可以向前移动之前必须等待回复的活动。阻塞是指线程处于等待状态(通常意味着在某些事件发生之前不会被调度执行)。从这里可以得出结论,同步调用可能涉及阻塞行为,也可能不会,具体取决于底层实现(即它也可能正在旋转,这意味着您正在模拟异步调用的同步行为)。
答案 1 :(得分:4)
我会将它们分类如下:
阻止 - 线程将等待操作直到成功或失败(突出显示'将等待',失败通常是超时)
同步 - 线程将在到达之后的任何行之前通过成功或失败完成操作(在操作完成时突出显示)
非阻塞 - 线程不会等待完成操作,立即执行操作
异步 - 另一个线程(逻辑或物理)将完成操作或使用回调通知它已准备就绪,在执行以下命令之前不会等待。 注意:此处的名称是异步的,因为您无法确定命令的执行顺序
答案 2 :(得分:3)
阻止 - 如果等待某个事件完成,则称操作具有阻塞行为。例如:如果锁定不可用,则线程可能会在事件上进入等待状态,直到锁定可用。据说这样的操作是封锁的。
同步 - 通过http协议的示例可以很容易地理解同步呼叫,其中客户端等待来自服务器的回复然后继续。同步呼叫可能是阻塞或非阻塞。
异步 - 一个方法可以异步调用其他方法。在调用之后,它可以继续执行其下一条指令。当被调用的方法完成它的执行时,它将向调用方法发送一个回复/回调它的成功或失败。
非阻塞 - 非阻塞行为就像检查该实例的条件一样。例如 - 如果锁不可用,它将不会等到阻塞操作可用。此外,我们需要反复检查锁的可用性,因为不会有像异步调用那样的回调。
要点: 阻止始终是同步的。
同步调用如果等待某个事件完成则有阻塞操作,调用方法可能进入等待状态。
如果在继续执行下一条指令之前反复检查某些事件,则同步调用是非阻塞的。调用者方法在某些事件上不会进入等待状态。
异步调用不能阻塞,它涉及需要处理的被调用方法的回调。
答案 3 :(得分:2)
同步意味着工作在调用函数的线程中完成,并且方法在完成之前不会返回。
异步方法立即返回,因为另一个线程完成工作并在工作完成时引发标志或触发事件。
阻塞意味着执行阻塞事件的线程将一直等到事件发生。例如,您尝试从套接字读取,没有人向您发送消息。阻止调用将不会返回,直到消息从套接字恢复。
好,非阻塞意味着与阻塞相反意味着非阻塞调用是异步的。