我有一点困惑。请看下面的代码。
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()
是调用非同步静态方法的静态同步方法。当thread-2获得类级锁时,为什么actBusy()
没有阻塞来自Thread-1的调用?
我只是在逻辑上感到困惑,如果一个线程获得了类级别的锁,那么该类的其他非同步静态方法仍然可以从其他方法(实例方法)调用。为什么?