Java死锁

解释:

男的要女孩,小偷要钱

while无限循环直至死锁

小偷那一块我让他先睡了一会儿,不然很容易一开始就造成死锁,看不到整个过程。

整个过程就是,一直循环,男的锁着钱,然后锁住女孩,循环好几次,直到小偷苏醒锁住了女孩

此时男的正好锁住钱,小偷锁住女孩。互相不肯让。造成死锁。

//当初将小偷和男人写在同一个run里是为了保证锁对象相同,但大可不必
//只要将girl改为Object.class,money改为String.class即可
public class DeadLock {
    public static void main(String[] args) {
        Lock man = new Lock();
        man.flag = 0;

        Lock thief = new Lock();
        thief.flag = 1;

        new Thread(man).start();
        new Thread(thief).start();

    }
}

class Lock implements Runnable {
    public int flag;//为了让他们能共用锁对象所以放在一个类中用Flag判断
    static Object money = new Object();//必须得是static,才能共用,去掉static你可以自己尝试一下
    static Object girl = new Object();
    @Override
    public void run() {
        while (true) {
            //男的拿着钱,要求交换女孩
            if (flag == 0) {
                synchronized (money) {
                    System.out.println("放开那个女孩,我给你钱");
                    synchronized (girl) {
                        System.out.println("男孩救出了女孩,给了钱");
                    }
                }
            }
            //小偷威胁女孩,要钱
            if (flag == 1) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (girl) {
                    System.out.println("给我钱,我就放开这个女孩");
                    synchronized (money) {
                        System.out.println("小偷拿到了钱,放开了女孩");
                    }
                }
            }
        }
    }
}

如何避免死锁呢?
让多个线程都按照相同的锁顺序执行就行了,就例如上面两个,锁顺序都改为girl--money就不会死锁。

posted @ 2021-04-13 19:57  lwxx  阅读(58)  评论(0)    收藏  举报