欢迎光临散文网 会员登陆 & 注册

线程的死锁的代码

2020-04-14 21:08 作者:小垃圾kiki  | 我要投稿
package cn.jd.syn;

/*
 * 死锁:过多的同步可能造成相互不释放资源
 * 从而相互等待,一般发生于同步中持有多个对象的锁
 * 如何解决:不要在同一个代码块中,同时持有多个对象的锁
 * 第二个锁在第一个锁里面才能造成死锁
 */
public class DeadLock {
    public static void main(String[] args) {
        Makeup g1 = new Makeup(1, "哈哈");
        Makeup g2 = new Makeup(0, "呵呵");
        g1.start();
        g2.start();

    }
}

//口红
class Lipstick {

}

//镜子
class Mirror {

}

//化妆
class Makeup extends Thread {
    // 表示一面口红和一个镜子
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();
    // 选择
    int choice;
    // 名字
    String girl;

    public Makeup(int choice, String girl) {
        this.choice = choice;
        this.girl = girl;
    }

    @Override
    public void run() {
        // 化妆
        makeup();
    }

    // 相互持有对方的对象锁-->可能造成死锁
    private void makeup() {
        if (choice == 0) {
            synchronized (lipstick) {// 获得口红的锁
                System.out.println(this.girl + "涂口红");
                // 1秒后想拥有镜子的锁
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
            synchronized (mirror) {
                System.out.println(this.girl + "照镜子");
            }
        } else {
            synchronized (mirror) {// 获得口红的锁
                System.out.println(this.girl + "照镜子");
                // 1秒后想拥有口红的锁
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
            synchronized (lipstick) {
                System.out.println(this.girl + "涂口红");
            }

        }
    }
}

线程的死锁的代码的评论 (共 条)

分享到微博请遵守国家法律