非static synchronized メソッドはクラスオブジェクトをロックするが、 static synchronized メソッドを実行するとクラス自体をロックする。 lock1, lock2 はともに static synchronized メソッドで、別スレッドからそれぞれほぼ同時に ClassLock.lock1, ClassLock.lock2 を実行すると lock1 が終了するまで lock2 はロック解除待ち状態となる。 static synchronized メソッドは滅多に宣言しないがバグの原因になりそう。
[ClassLock.java]
/**
* synchronize static によるクラスロック テストクラス
*/
public class ClassLock {
/**
* main
*/
public static void main(String[] args) {
WaitNotifyTest2 wn = new WaitNotifyTest2();
Thread th1 = new Thread(new LockCall(1));
Thread th2 = new Thread(new LockCall(2));
th1.start();
th2.start();
}
/**
* static synchronized lock1
*/
public static synchronized void lock1() {
System.out.println("lock1 -->");
for(int i = 0; i < 100000000;i++) {}
System.out.println("lock1 <--");
}
/**
* static synchronized lock1
*/
public static synchronized void lock2() {
System.out.println("lock2 ==>");
System.out.println("lock2 <==");
}
}
/**
* lock1, lock2を実行するスレッド
*/
class LockCall implements Runnable {
int lock;
LockCall(int lock) {
this.lock = lock;
}
public void run() {
switch(lock) {
case 1:
ClassLock.lock1();
break;
case 2:
ClassLock.lock2();
break;
}
}
}
実行結果
lock1 -->
lock1 <--
lock2 ==>
lock2 <==