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