多线程死锁问题:哲学家就餐问题代码实现

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();

    }
}

程序运行结果一定是冤家路窄,两个人分别抢到一根筷子,然后都没法吃饭了。(死锁)具体情况如下:
黑格尔抢走了左手筷子
黑格尔抢走了右手筷子
黑格尔抢走一双筷子吃了一口饭!
黑格尔抢走了左手筷子
黑格尔抢走了右手筷子
黑格尔抢走一双筷子吃了一口饭!
黑格尔抢走了左手筷子
黑格尔抢走了右手筷子
黑格尔抢走一双筷子吃了一口饭!
黑格尔抢走了左手筷子
黑格尔抢走了右手筷子
黑格尔抢走一双筷子吃了一口饭!
黑格尔抢走了左手筷子
黑格尔抢走了右手筷子
黑格尔抢走一双筷子吃了一口饭!
黑格尔抢走了左手筷子
叔本华抢走了右手筷子

你可能感兴趣的:(语法与技术)