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