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

你可能感兴趣的:(java,开发语言)