になぜ起こるか私はマルチスレッドに新しいですし、私はこの例に出くわしたの理解:デッドロックは、この実装
public class TestThread {
public static Object Lock1 = new Object();
public static Object Lock2 = new Object();
public static void main(String args[]) {
ThreadDemo1 T1 = new ThreadDemo1();
ThreadDemo2 T2 = new ThreadDemo2();
T1.start();
T2.start();
}
private static class ThreadDemo1 extends Thread {
public void run() {
synchronized (Lock1) {
System.out.println("Thread 1: Holding lock 1...");
try { Thread.sleep(10); }
catch (InterruptedException e) {}
System.out.println("Thread 1: Waiting for lock 2...");
synchronized (Lock2) {
System.out.println("Thread 1: Holding lock 1 & 2...");
}
}
}
}
private static class ThreadDemo2 extends Thread {
public void run() {
synchronized (Lock2) {
System.out.println("Thread 2: Holding lock 2...");
try { Thread.sleep(10); }
catch (InterruptedException e) {}
System.out.println("Thread 2: Waiting for lock 1...");
synchronized (Lock1) {
System.out.println("Thread 2: Holding lock 1 & 2...");
}
}
}
}
}
これは、次のサンプル出力を発生します
Thread 1: Holding lock 1...
Thread 2: Holding lock 2...
Thread 1: Waiting for lock 2...
Thread 2: Waiting for lock 1...
すなわち、デッドロックがあります。しかし、それは次のようになりますように、私たちは第二のスレッドで取得したロックの順序を変更した場合、:
public class TestThread {
public static Object Lock1 = new Object();
public static Object Lock2 = new Object();
public static void main(String args[]) {
ThreadDemo1 T1 = new ThreadDemo1();
ThreadDemo2 T2 = new ThreadDemo2();
T1.start();
T2.start();
}
private static class ThreadDemo1 extends Thread {
public void run() {
synchronized (Lock1) {
System.out.println("Thread 1: Holding lock 1...");
try { Thread.sleep(10); }
catch (InterruptedException e) {}
System.out.println("Thread 1: Waiting for lock 2...");
synchronized (Lock2) {
System.out.println("Thread 1: Holding lock 1 & 2...");
}
}
}
}
private static class ThreadDemo2 extends Thread {
public void run() {
synchronized (Lock1) {
System.out.println("Thread 2: Holding lock 1...");
try { Thread.sleep(10); }
catch (InterruptedException e) {}
System.out.println("Thread 2: Waiting for lock 2...");
synchronized (Lock2) {
System.out.println("Thread 2: Holding lock 1 & 2...");
}
}
}
}
}
期待どおりに動作し、サンプル出力は次のようになります。
Thread 1: Holding lock 1...
Thread 1: Waiting for lock 2...
Thread 1: Holding lock 1 & 2...
Thread 2: Holding lock 1...
Thread 2: Waiting for lock 2...
Thread 2: Holding lock 1 & 2...
ができ誰かがデッドロックの原因となっている最初のもので何が起こっているのかを私に説明して、なぜ2番目のコードの変更がそれを修正するのですか?
ありがとうございました。私は今、最初のケースを理解することができます。しかし、2番目のケースはまだ少しばかりです。したがってスレッド2は最初のロックを待っています。それがスレッド1によって解放されるとすぐに、どうなりますか? – SexyBeast
@AttitudeMongerスレッド2はそれを取得し、同期ブロックの下の最初のステートメントの実行を開始します。 – Maroun
'System.out.println("スレッド2:ロック1と2を保持しています... ");'?そして、スレッド1によって獲得されたロック2を解放し、 'System.out.println("スレッド1:ロック1と2を保持... ");'? – SexyBeast