少し混乱しています。以下のコードを見てください。
public class ThreadDemo {
//non-static synchronized method
synchronized void a(){
actBusy();
}
//static synchronized method
static synchronized void b(){
actBusy();
}
//static method
static void actBusy(){
try{
Thread.sleep(1000);
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
final ThreadDemo x = new ThreadDemo();
final ThreadDemo y = new ThreadDemo();
Runnable runnable = new Runnable() {
public void run() {
int option = (int) (Math.random() * 4);
switch (option){
case 0: x.a();
break;
case 1: x.b();
break;
case 2: y.b();
break;
case 3: y.b();
break;
}
}
} ;
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
}
}
このシーケンスの呼び出しが可能であることは確かです。
x.a() //in Thread-1
y.b() //in Thread-2
まだ少し混乱していますが、静的メソッドであるメソッドx.a()
も呼び出すことが簡単にわかります。actBusy()
メソッドb()
は、非同期静的メソッドを呼び出す静的同期メソッドです。スレッド 2 がクラス レベルのロックを取得するとactBusy()
、スレッド 1 からの呼び出しがブロックされないのはなぜですか?
スレッドがクラスレベルのロックを取得した場合、そのクラスの他の同期されていない静的メソッドは、他のメソッド(インスタンスメソッド)から呼び出されるために開いたままになります。なんで?