java死锁例子

java死锁

(之前参考了一篇穿衣服 穿裤子的博客,但是找不到了,现在自己做一个记录)
在对线程的场景下可能会出现死锁的情况,我们要杜绝这种情况的发生,会对程序产生灾难性的影响。

死锁出现的原因:可以总结为A B线程互相持有了对方在等待的资源,例如A持有了b,但是A需要a才能继续执行下去,同时B持有了a,但是B需要b才能继续执行。此时就造成了死锁的发生。

以下举个例子来说明。

场景:A、B两个人,A需要先穿衣服再穿裤子,但是B需要先穿裤子再穿衣服

class Dress{
    public void get("拿到了衣服");
}

class Trousers{
	public void get("拿到了裤子");
}

class DeadLock implements Runnable{
    public boolean flag=true;
    public static Dress dress = new Dress(); //加了static才能说是操作的同一份资源
    public static Trousers trouser=new Trousers();//如果不加static操作的不是同一份资源
    
    @Override
    public void run(){
        if(flag){
            //如果为true  先拿到裤子 对裤子加锁
            synchronized (trouser){
                try{
                    //sleep 一秒的目的是让另外一个线程提前抢到衣服的锁
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                synchronized(dress){
                    //要去拿衣服 如果拿到了 调用
                    dress.get();
                }
            }
        }else{
            //flase 先拿到衣服 对衣服进行加锁
            synchronized(dress){
                try{
                    //sleep 一秒的目的是让另外一个线程提前抢到裤子服的锁
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                synchronized(trouser){
                    trouser.get();
                }
            }
        }
    } 
    
    public static void  main(String[] args){
        DeadLock d1=new DeadLock();
        DeadLock d2=new DeadLock();
        
        d1.flag=true;//让线程1先去拿到裤子
        d2.flag=false;//2先去拿衣服
        
        new Thread(d1).start();//启动线程1
        new Thread(d2).start();//启动线程2
    }
   
}


总结:在多线程竞争公共资源的情况下才会出现死锁的现象。static

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值