线程中的死锁问题

来源:互联网 发布:台服dnf登陆器源码 编辑:程序博客网 时间:2024/05/16 06:18

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


下面是一个线程死锁的例子:
例:
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();     }}



死锁分析: