哲學家用餐問題,怎麼樣保證沒有死鎖,最直接的乙個方案就是要保證,每乙個哲學家在拿筷子的時候,左右兩邊都能拿到,才去拿,如果不能保證那就乙個筷子都不拿。
對與這個問題的實現,可以設定五個訊號量,標識筷子是否可以拿。具體**如下。
public static class person implements runnable
@override
public void run()
} catch (interruptedexception e)
} }
public void thinking() catch (interruptedexception e)
} public void eating() catch (interruptedexception e)
} }
public static void main(string args)
executorservice executor=executors.newfixedthreadpool(5);
for (int i = 1; i < 6; i++)
}
上面用訊號量的方式在拿筷子之前會檢查兩個筷子是不是可用,不可用的話,當前執行緒並沒有掛起,而是直接跳過吃飯環節又去思考了,那麼我們想實現的是,沒有筷子我就要掛起,乙個人思考完就一定要吃,吃完就一定要思考,迴圈起來。那麼就需要對筷子的使用上鎖,對於筷子不能同時用,我們就直接掛起執行緒,在檢查筷子能不能同時用的時候,拿起乙隻筷子,在另乙隻不能用的情況下,就應該放下剛拿起的那乙隻,然後再阻塞執行緒。
static chop chops=new chop[6]; //筷子從1開始,人也是從1開始,逆時針排序
public static class chop
public void getchop() else
}else
condition.await();
}tag=true;
} catch (exception e) finally
} public void dropchop()
} public static class person implements runnable
@override
public void run()
} public void thinking() catch (interruptedexception e)
} public void eating() else
chops[index].getchop();
system.out.println("person"+ index+" eating");
thread.sleep(3000);
} catch (interruptedexception e)
} }public static void main(string args)
executorservice executor=executors.newfixedthreadpool(5);
for (int i = 1; i < 6; i++)
}
哲學家用餐問題
哲學家用餐問題,5位哲學家坐在圓桌旁,每對哲學家之間只有一根筷子。如果乙個哲學家可以拿起他旁邊的兩根筷子,他就可以吃東西。一根筷子可以由其相鄰的任何乙個哲學家拿起,但不能同時被兩個哲學家拿起。如果遵循乙個簡單的規則,就可以避免死鎖 讓所有執行緒以相同的順序宣告並釋放其鎖。這樣,您永遠不會陷入可能發生...
哲學家用餐問題
五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考。在這裡插入描述 分析 放在桌子上的筷子是臨界資源,在一段時間內...
linux多執行緒 3 哲學家用餐 mutex實現
ref 5跟筷子,5個哲學家,哲學家要吃飯,自然要兩根筷子,這樣就出現資源爭用的情況。哲學家只能用左邊和右邊的筷子,兩根筷子備齊才能吃飯!使用mutex的話,就是每個筷子乙個mutex,需要5個mutex,哲學家先lock左邊的筷子,如果有人已經在用那根筷子了,那就等著,不然左邊的筷子就拿到手了,然...