[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 12616] Re: 2007/2/17 議事録 [ 改 ]



  高橋(智)です。

> 14-6-1 ReentrantLock

  モニタではなくReentrantLockを使用した場合のデッドロックの検出についてですが、
ちょっと前の Borland OptimizeIt 2006 の ThreadDebugger を使用して試してみました。
  やはり、デッドロックの検出には至りませんでした。
  スレッドの状態も「競合によるブロック」ではなく「I/Oによるブロック」と認識されて
しまいます。(モニタを所有していることも認識されません)

  なお、この「I/Oによるブロック」を分析すると、「java.util.concurrent.locks.LockSupport」
クラスのstaticなpark()メソッドでブロックしていることが分かります。


[Frame]
-----------------------------------------------------------------------
public class Frame1 extends JFrame {
  ...
  public void jButton1_actionPerformed(ActionEvent e) {
    ReentrantLock locka = new ReentrantLock(); // lock a
    ReentrantLock lockb = new ReentrantLock(); // lock b
    MyThread mt1 = new MyThread(locka, lockb);
    MyThread mt2 = new MyThread(lockb, locka);  // reverse lock order
    new Thread(mt1, "MyThread1").start();       // lock a --> lock b
    new Thread(mt2, "MyThread2").start();       // lock b --> lock a
  }
  ...
}
-----------------------------------------------------------------------

[Thread]
-----------------------------------------------------------------------
public class MyThread implements Runnable {
  private Lock locka;
  private Lock lockb;

  public MyThread(Lock locka, Lock lockb) {
    this.locka = locka;
    this.lockb = lockb;
  }

  public void run() {
    locka.lock();
    try {
      try {
        Thread.sleep(1000 * 5);
      }
      catch (InterruptedException ex) {
      }
      lockb.lock();
      try {
        System.out.println("never reach here");
      }
      finally {
        lockb.unlock();
      }
    }
    finally {
      locka.unlock();
    }
  }
}
-----------------------------------------------------------------------


-- 
高橋智宏
  Java読書会( http://www.javareading.com/bof/ )