2010-08-05 70 views
2

現場http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/starvelive.html 有一個活鎖的概念,首先是說這裏的線程沒有被阻塞,之後說是線程被阻塞...「他們仍然互相阻塞」 所以我不太瞭解...如果他們被阻止似乎像死鎖...線程活鎖疑問

任何人都可以提交一個簡單的Java代碼的livelock情況更好,如果它能夠模擬Alphonse和Gaston的例子報道Java的現場?

+0

有趣。我已經看到了一個完全不同的「活鎖」定義,涉及兩個線程通過管道交換數據,發件人忘記刷新它,以便讀者無限期地等待數據。 – finnw 2010-08-05 10:25:11

+0

+1非常有趣 – naikus 2010-08-05 10:38:37

回答

1

由於死鎖,有兩個或多個線程:每個線程持有一個鎖,並且需要獲取另一個鎖。每個線程都睡在另一個線程持有的鎖上。因爲他們睡着了,他們是'死了' - 不執行任何代碼,他們永遠不會。

使用livelock時,兩個或更多線程處於活動狀態並正在執行代碼,但它們無法繼續執行代碼中的過去條件,因爲它們忙於響應來自活鎖中其他線程的事件。

我的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 

如果這兩個線程總是交替的指令,既不是一個永遠不會吃 夾層:他們都將所有時間都花在收購,測試和 下降鎖,但日永遠不會取得進展。