乙個併發應用程式能及時執行的能力稱為活躍性。本節將介紹最常見的活躍性問題:死鎖(deadlock),以及另外兩個活躍性問題:飢餓(starvation)和活鎖(livelock)。
死鎖描述了這樣一種情景,兩個或多個執行緒永久阻塞,互相等待對方釋放資源。下面是乙個例子。
alphone和gaston是朋友,都很講究禮節。禮節有乙個嚴格的規矩,當你向乙個朋友鞠躬時,你必須保持鞠躬的姿勢,直到你的朋友有機會回鞠給你。不幸的是,這個規矩沒有算上兩個朋友相互同時鞠躬的可能。
下面的應用例子,deadlock,模擬了這個可能性。
01
static
class
friend
06
public
string getname()
09
public
synchronized
void
bow(friend bower)
15
public
synchronized
void
bowback(friend bower)
20
}
21
22
public
static
void
main(string args)
29
}).start();
30
new
thread(
new
runnable()
32
}).start();
33
}
34
}
當deadlock執行後,兩個執行緒極有可能阻塞,當它們嘗試呼叫bowback方法時。沒有哪個阻塞會結束,因為每個執行緒都在等待另乙個執行緒退出bow方法。
飢餓和活鎖並不如死鎖一般普遍,但它仍然是每個併發程式設計者可能會遇到的問題。
飢餓是指當乙個執行緒不能正常的訪問共享資源並且不能正常執行的情況。這通常在共享資源被其他「貪心」的執行緒長期時發生。舉個例子,假設乙個物件提供了乙個同步方法,這個方法通常需要執行很長一段時間才返回。如果乙個執行緒經常呼叫這個方法,那麼其他需要同步的訪問這個物件的執行緒就經常會被阻塞。
乙個執行緒通常會有會響應其他執行緒的活動。如果其他執行緒也會響應另乙個執行緒的活動,那麼就有可能發生活鎖。同死鎖一樣,發生活鎖的執行緒無法繼續執行。然而執行緒並沒有阻塞——他們在忙於響應對方無法恢復工作。這就相當於兩個在走廊相遇的人:alphonse向他自己的左邊靠想讓gaston過去,而gaston向他的右邊靠想讓alphonse過去。可見他們阻塞了對方。alphonse向他的右邊靠,而gaston向他的左邊靠,他們還是阻塞了對方。
文章**
併發程式設計網-ifeve.com
筆記《Oracle官方併發教程》4 活躍度
活躍性就是指乙個併發應用程式能及時執行的能力。本小節介紹最常見的活躍度問題 死鎖 deadlock 還有飢餓 starvation 和活鎖 livelock 死鎖就是說,兩個或多個執行緒相互阻塞,都在等待對方釋放資源。例如,兩個朋友鞠躬,a向b鞠躬時,必須保持姿勢,直到b向a回鞠躬。這個時候,如果兩...
Oracle官方教程之Fork Join
ork join框架是executorservice介面的一種具體實現,目的是為了幫助你更好地利用多處理器帶來的好處。它是為那些能夠被遞迴地拆解成子任務的工作型別量身設計的。其目的在於能夠使用所有可用的運算能力來提公升你的應用的效能。類似於executorservice介面的其他實現,fork jo...
Oracle官方教程之Fork Join
ork join框架是executorservice介面的一種具體實現,目的是為了幫助你更好地利用多處理器帶來的好處。它是為那些能夠被遞迴地拆解成子任務的工作型別量身設計的。其目的在於能夠使用所有可用的運算能力來提公升你的應用的效能。類似於executorservice介面的其他實現,fork jo...