网站http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/starvelive.html 有一个livelock的概念,首先说这里线程没有被阻塞,之后被称为线程被阻塞......“他们仍然互相阻塞” 所以我不太了解......如果它们被阻止,它似乎就像僵局......
如果有人能够模拟Java网站上报告的Alphonse和Gaston示例,那么有人可以更好地向我提交活锁情况的简单Java代码吗?
答案 0 :(得分:1)
有死锁,有两个或更多线程:每个线程持有一个锁,并需要获取另一个锁。每个线程都在另一个线程所持有的锁上休眠。因为他们睡着了,他们“死了” - 没有执行任何代码,他们永远不会。
使用活锁,两个或多个线程处于活动状态并执行代码,但它们无法继续通过代码中的条件,因为它们忙于响应来自活锁中其他线程的事件。
我的Java在这一点上非常生疏,所以让我们带着希望简单的描述:
两个主题A
和B
需要获取锁1
和2
才能执行某些操作(吃三明治):
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
如果这两个线程总是交替指示,那么任何人都不会吃 三明治:他们都会把所有时间花在获取,测试和 放下锁,但他们永远不会取得进展。