我正在读“使用Java的操作系统概念”。我被阻塞和同步的概念弄糊涂了,它们之间有什么区别?
发布于 2011-12-08 01:35:18
阻塞可能与同步相同,也可能不同,这取决于上下文。当我们讨论方法调用时,同步调用也可以说是阻塞的(稍后我将讨论这一点),因为调用该方法的线程在该方法返回之前不能继续执行。本例中的反义词将是异步的。
在锁术语中,如果等待获取锁的线程处于挂起模式,直到锁可用(或直到超时),则锁称为阻塞。本例中的反义词是非阻塞锁,这意味着即使无法获取锁,线程也会立即返回。这可以用来实现所谓的旋转锁,在这种锁中,您可以保持轮询锁的状态,同时保持线程处于活动状态。
话虽如此,您可以推断出这两个概念之间的区别:同步通常意味着在线程可以向前移动之前必须等待回复的活动。阻塞指的是线程处于等待状态(通常意味着在某个事件发生之前不会调度执行)。从这里可以得出结论,同步调用可能涉及阻塞行为,也可能不涉及阻塞行为,这取决于底层实现(即,它可能也在旋转,这意味着您正在使用异步调用模拟同步行为)。
发布于 2018-02-19 13:07:07
阻塞操作称为阻塞行为,如果它等待某个事件完成。例如:如果锁不可用,线程可能会在事件上进入等待状态,直到锁可用。这样的操作被称为阻塞。
同步-通过http协议示例可以容易地理解同步调用,其中客户端等待来自服务器的回复,然后继续进行。同步调用可以是阻塞的或非阻塞的。
异步-一个方法可以异步调用其他方法。在调用之后,它可以继续执行下一条指令。当被调用的方法完成执行时,它将向调用者方法发送一个成功或失败的回复/回调。
非阻塞-非阻塞行为类似于在该实例中检查条件。例如,在锁的情况下,如果它不可用,它不会像阻塞操作一样等待它可用。我们还需要反复检查锁的可用性,因为不会有像异步调用那样的回调。
摘要:阻塞始终是同步的。
同步调用具有阻塞操作,如果它等待某个事件完成,调用者方法可能会进入等待状态。
如果同步调用在继续执行下一条指令之前反复检查某个事件是否发生,则它是非阻塞调用。调用方方法在某些事件完成时不会进入等待状态。
异步调用不能是阻塞的,它涉及需要处理的被调用方法的回调。
发布于 2014-09-23 22:09:37
我会把它们归类如下:
阻塞-线程将等待操作,直到成功或失败(突出显示“将等待”,失败通常是超时)
同步-线程将完成操作,无论是成功还是失败,然后到达它之后的任何行(在操作完成时突出显示)
非阻塞-线程将不等待完成操作,立即执行操作
异步-另一个线程(逻辑的或物理的)将完成操作或使用回调通知它已准备就绪,在执行以下命令之前不会等待。注意:异步这个名称是从这里产生的,因为您不能确定命令的执行顺序
https://stackoverflow.com/questions/8416874
复制相似问题