鍵の説明

2409 ワード

コードを見てください:
public class TestDeadLock implements Runnable{

     int flag = 1;
     static Object o1 = new Object();  // 1, 
    static Object o2 = new Object();  // 2, 

 public static void main(String[] args) {
      TestDeadLock td1 = new TestDeadLock();
      TestDeadLock td2 = new TestDeadLock();
      td1.flag = 1;
      td2.flag = 0;
      Thread t1 = new Thread(td1);
      Thread t2 = new Thread(td2);
      t1.start();
      t2.start();
 }

 // , , , synchronized ,
 public void run() {
      if(flag == 1){
           synchronized(o1)
           {
                try {
                      Thread.sleep(1000);
                } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                }

                synchronized(o2){
                    System.out.println("t1 succeed");
                }
           }
      }

     if(flag == 0){
           synchronized(o2){
                try {
                     Thread.sleep(1000);
                } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                }

                synchronized(o1){
                      System.out.println("t2 succeed");
                }
           }
      }
 }

}

(1)スレッドt 1(td 1)は、1人に相当する.
(2)対象o 1はロックに相当する.ロックは、独占リソースとも呼ばれます.
(3)synchronized(o 1)は部屋の財産に相当する.
スレッドt 1がsynchronized(o 1)に実行されると、この人が部屋に入ったことに相当し、同時に部屋のドアをロック(すなわちo 1ロック)し、スレッドt 1がsynchronized(o 1)のコードセグメントを出た後、この人が部屋を出たことに相当し、同時にロックを解放し、他の人(例えばt 2)がロックを持つことができ、部屋に入ることができる.
 
上端コード,t 1,t 2の2つのスレッドを見てみると,まずt 1がrun()メソッドに入り,次にflagが1であるか否かを判断し,1であるとオブジェクトo 1によって次のコードをロックし,同時にt 2がrun()メソッドに入りflag,0であると判断すると,o 2によって次のコードをロックし,再び振り返ると,t 1は下向きに実行され,synchronized(o 2)に実行され,このときo 2オブジェクトはt 2にロックされ,したがって、o 1は、o 2オブジェクトのロック解除フラグを待つのを開始し、同様に、t 2は下に進むsynchronized(o 1)に実行され、o 1オブジェクトのロック解除フラグを待つのを開始する.このように互いに待ち合うと、デッドロックが発生する.注意:static Object o 1=new Object()を前のstaticを外すとデッドロックは発生しません.これは、この2つのスレッドには独自のo 1があります.つまり、ロックは共通ではないので、デッドロックは発生しません.