线程活锁怀疑

时间:2010-08-05 10:19:44

标签: java multithreading

网站http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/starvelive.html 有一个livelock的概念,首先说这里线程没有被阻塞,之后被称为线程被阻塞......“他们仍然互相阻塞” 所以我不太了解......如果它们被阻止,它似乎就像僵局......

如果有人能够模拟Java网站上报告的Alphonse和Gaston示例,那么有人可以更好地向我提交活锁情况的简单Java代码吗?

1 个答案:

答案 0 :(得分:1)

有死锁,有两个或更多线程:每个线程持有一个锁,并需要获取另一个锁。每个线程都在另一个线程所持有的锁上休眠。因为他们睡着了,他们“死了” - 没有执行任何代码,他们永远不会。

使用活锁,两个或多个线程处于活动状态并执行代码,但它们无法继续通过代码中的条件,因为它们忙于响应来自活锁中其他线程的事件。

我的Java在这一点上非常生疏,所以让我们带着希望简单的描述:

两个主题AB需要获取锁12才能执行某些操作(吃三明治):

Thread A tries this:

Acquire lock 1
if try_lock(2) == success
  eat the sandwich
else
  drop 1
  sleep a bit
  go back to start


Thread B tries this:

Acquire lock 2
if try_lock(1) == success
  eat the sandwich
else
  drop 2
  sleep a bit
  go back to start

如果这两个线程总是交替指示,那么任何人都不会吃 三明治:他们都会把所有时间花在获取,测试和 放下锁,但他们永远不会取得进展。