[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/ )