多線程死鎖問題:哲學家就餐問題代碼實現

public class AAA implements Runnable {
    @Override
    public void run() {
        while(true){
            //同步代碼塊
            synchronized ("左手筷子"){
                System.out.println("黑格爾搶走了左手筷子");

                //同步代碼塊
                synchronized ("右手筷子"){
                    System.out.println("黑格爾搶走了右手筷子");

                    System.out.println("黑格爾搶走一雙筷子吃了一口飯!");
                }
            }
        }
    }
}

public class BBB implements Runnable {
    @Override
    public void run() {

        while(true){
            //同步代碼塊
            synchronized ("右手筷子"){
                System.out.println("叔本華搶走了右手筷子");

                //同步代碼塊
                synchronized ("左手筷子"){
                    System.out.println("叔本華搶走了左手筷子");

                    System.out.println("叔本華搶走一雙筷子吃了一口飯!");
                }
            }
        }
    }
}

public class Demo {
    public static void main(String[] args) {

        //開啓線程
        new Thread(new AAA()).start();

        //開啓線程
        new Thread(new BBB()).start();

    }
}

程序運行結果一定是冤家路窄,兩個人分別搶到一根筷子,然後都沒法吃飯了。(死鎖)具體情況如下:
黑格爾搶走了左手筷子
黑格爾搶走了右手筷子
黑格爾搶走一雙筷子吃了一口飯!
黑格爾搶走了左手筷子
黑格爾搶走了右手筷子
黑格爾搶走一雙筷子吃了一口飯!
黑格爾搶走了左手筷子
黑格爾搶走了右手筷子
黑格爾搶走一雙筷子吃了一口飯!
黑格爾搶走了左手筷子
黑格爾搶走了右手筷子
黑格爾搶走一雙筷子吃了一口飯!
黑格爾搶走了左手筷子
黑格爾搶走了右手筷子
黑格爾搶走一雙筷子吃了一口飯!
黑格爾搶走了左手筷子
叔本華搶走了右手筷子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章