线程中的死锁问题


线程中的死锁都是发生在多个线程中的,多个线程中存在多个同步锁,这几个线程相互索取对方锁的钥匙造成的僵持局面
多个线程中的多个同步锁,先后索取对方锁的钥匙时,有时也会出现和谐的状态,如两个人吵架,相互不让,结果某一刻突然相互谅解了对方就进入和谐的状态了。


下面是一个线程死锁的例子:
例:
class RunnableImp implements Runnable
{
     boolean flag = true;
     Object obj1 = new Object();
     Object obj2 = new Object();
     public void run(){
          if(flag){
               synchronized(obj1){//第一个线程1先获得obj1对象锁,并将其锁住
                   
                         System.out.println(Thread.currentThread().getName()+"先获得obj1");
                         try{
                              Thread.sleep(1000);//先让线程1睡眠一段时间,让线程2有时间去获得obje2对象锁
                         }catch(Exception e){}
                         synchronized(obj2){//线程1醒来后,想去获得obj2锁,但是此锁已经被线程2获得并锁住了,所以需要等待线程2解开obj2锁
                              System.out.println(Thread.currentThread().getName()+"想获得obj2");
                         }
                   
               }
          }else{
               synchronized(obj2){//第二个线程2在线程1睡眠时先获得obj2对象锁,同样也将其锁住
                   
                         System.out.println(Thread.currentThread().getName()+"先获得obj2");
                         try{
                              Thread.sleep(1000);//让线程2睡眠一段时间,如果线程2先启动,就可以先让线程1先去获得obj1锁
                         }catch(Exception e){}
                         synchronized(obj1){
                              System.out.println(Thread.currentThread().getName()+"想获得obj1");
                         }
              
               }
          }
     }
}
public class TestRunnable
{
     public static void main(String[] args)
     {
          RunnableImp r = new RunnableImp();
          Thread t1 = new Thread(r,"线程1");
          Thread t2 = new Thread(r,"线程2");
          t1.start();
          try{
               Thread.sleep(100);
          }catch(Exception e){}
          r.flag = false;
          t2.start();
     }
}



死锁分析:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值