死锁及解决方案

死锁的概念

      “死锁”指的是:

        多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形。

      因此, 某一个同步块需要同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题。下面案例中,“化妆线程”需要同时拥有“镜子对象”、“口红对象”才能运行同步块。那么,实际运行时,“小丫的化妆线程”拥有了“镜子对象”,“大丫的化妆线程”拥有了“口红对象”,都在互相等待对方释放资源,才能化妆。这样,两个线程就形成了互相等待,无法继续运行的“死锁状态”。

【示例】死锁问题

public class TestDeadLock {
    public static void main(String[] args) {
        Girl girl1=new Girl("大丫",0);
        Girl girl2=new Girl("小丫",1);
        girl1.start();
        girl2.start();
    }
}
class Mirror{
}
class Lipstick{
}
class Girl extends Thread{
    static Mirror mirror=new Mirror();
    static Lipstick lipstick=new Lipstick();
    String name;
    int flag;
    public Girl(String name,int flag){
        this.name=name;
        this.flag=flag;
    }
    public void run(){
        makeup();
    }
    public void makeup(){
        if(this.flag==0){
            synchronized (lipstick){
                System.out.println(this.name+"拿到了口红");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (mirror){
                    System.out.println(this.name+"拿到了镜子");
                }
            }



        }else{
            synchronized (mirror){
                System.out.println(this.name+"拿到了镜子");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lipstick){
                    System.out.println(this.name+"拿到了口红");
                }


            }


        }
    }
}

【运行结果】

死锁的解决方法

      死锁是由于“同步块需要同时持有多个对象锁造成”的,要解决这个问题,思路很简单,就是:同一个代码块,不要同时持有两个对象锁。 如上面的死锁案例

【示例】死锁问题的解决

public class TestDeadLock {
    public static void main(String[] args) {
        Girl girl1=new Girl("大丫",0);
        Girl girl2=new Girl("小丫",1);
        girl1.start();
        girl2.start();
    }
}
class Mirror{
}
class Lipstick{
}
class Girl extends Thread{
    static Mirror mirror=new Mirror();
    static Lipstick lipstick=new Lipstick();
    String name;
    int flag;
    public Girl(String name,int flag){
        this.name=name;
        this.flag=flag;
    }
    public void run(){
        makeup();
    }
    public void makeup(){
        if(this.flag==0){
            synchronized (lipstick){
                System.out.println(this.name+"拿到了口红");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
            synchronized (mirror){
                System.out.println(this.name+"拿到了镜子");
            }
        }else{
            synchronized (mirror){
                System.out.println(this.name+"拿到了镜子");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            synchronized (lipstick) {
                System.out.println(this.name + "拿到了口红");
            }
        }
    }
}

 

 【运行结果】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值