死锁和活锁有什么区别?
|
有人可以用示例解释一下(死锁)和活锁之间的区别吗?
没有找到相关结果
已邀请:
6 个回复
癸痊醒
咳累录酬
惜堡沁戚
活锁示例
[...]考虑以下事件顺序: P0将标志[0]设置为true。 P1将flag [1]设置为true。 P0检查标志[1]。 P1检查标志[0]。 P0将标志[0]设置为false。 P1将flag [1]设置为false。 P0将标志[0]设置为true。 P1将flag [1]设置为true。 此序列可以无限期扩展,并且任何过程都不能进入其关键部分。严格来说,这不是死锁,因为这两个过程的相对速度的任何改变都将打破此循环并允许一个进入关键部分。这种情况称为活锁。回想一下,当一组进程希望进入其关键部分而没有成功的进程时,就会发生死锁。使用livelock,可能会有成功的执行序列,但是也有可能描述一个或多个执行序列,其中没有进程进入其关键部分。
旅牢斯讲
糖固傻染
样本输出:
活锁的Java示例:
样本输出:
这两个示例都强制线程以不同的顺序获取锁。 当死锁等待另一个锁时, 活锁实际上并没有真正等待-拼命尝试获取锁而没有机会获得它。每次尝试都会消耗CPU周期。
闪票仇门韧
因此,当线程A进入
循环并持有锁时,它会执行所需的操作并将
设置为
。然后线程B进入,进入
循环,由于
现在是
,因此它可以保持锁。这样做,执行
块,并将ѭ9sets设置回
。现在,线程A再次获得它的新CPU窗口,它即将退出
循环,但是线程B刚刚将其设置回
,因此该循环再次重复。线程可以执行某些操作(因此在传统意义上不会被阻塞),但几乎没有任何作用。 可能还需要提及的是,活锁不一定必须出现在此处。我假设
块完成执行后,调度程序偏向另一个线程。在大多数情况下,我认为这是一个很难达到的期望,它取决于引擎盖下发生的许多事情。