筷子
public
class
chopsticks
哲學家
public
class
philosopher
private string name;
// 左手筷子
private chopsticks left;
// 右手筷子
private chopsticks right;
public
void
eating()
catch
(interruptedexception e)
synchronized
(right)
catch
(interruptedexception e)
system.out.
println
(this
.name+
" is eating ...");
}}}}
主函式
public
class
main).
start()
;new
thread((
)->).
start()
;new
thread((
)->).
start()
;new
thread((
)->).
start()
;new
thread((
)->).
start();}}
使用時先分配左手,再分配右手,產生了死鎖問題。
先獲取程序號
根據程序號檢視死鎖裝態
死鎖的詳細資訊
上面,哲學家p1先獲取左手的筷子c1,哲學家p5先獲取左手的筷子c5;之後哲學家p1再獲取右手的筷子c5,但是此時c5被哲學家p5佔據,且不可被搶奪,p1因此在等待。其他哲學家類似,因此造成了死鎖。
上例中,分配時先按左手分配,再按右手分配。我們可以改變分配方式,按照順序分配資源。在上面的例子中,只有p5的資源沒有按照順序分配,我們可以做如下修改。
執行結果如下圖所示,p5最後執行。使用按序分配資源的方式可以很簡單地解決死鎖問題,但是由於p5總是最後獲取資源,所以會產生飢餓問題。
上例中,通過按序分配避免了死鎖的迴圈等待條件的發生,在本例中,可以避免不可剝奪的條件,避免死鎖的發生。當哲學家獲取到左手的資源時,如果他未能及時申請到右手的資源,則將所有占有的資源釋放。
修改筷子的**,繼承reentrantlock,以便於可以加鎖及釋放。
public
class
chopsticks
extends
reentrantlock
修改eating方法的**,其他的不變。如果哲學家未能獲取到左手,則繼續等待。如果哲學家獲取到了左手的筷子,但未獲取到右手的筷子,則釋放左手的筷子。
public
void
eating()
catch
(interruptedexception e)
if(left.
trylock()
)catch
(interruptedexception e)
if(right.
trylock()
)finally}}
finally}}
}
執行結果如下。p5並不是總位於最後,因此不會有飢餓問題。
哲學家問題
問題描述 有五個哲學家繞著圓桌坐,每個哲學家面前有一盤面,兩人之間有一支筷子,這樣每個哲學家左右各有一支筷子。哲學家有2個狀態,思考或者拿起筷子吃飯。如果哲學家拿到乙隻筷子,不能吃飯,直到拿到2只才能吃飯,並且一次只能拿起身邊的一支筷子。一旦拿起便不會放下筷子直到把飯吃完,此時才把這雙筷子放回原處。...
哲學家就餐問題
本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...
哲學家進餐問題
哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...