我写了下面的程序,据我了解,它不应打印'Didn't hang, it should've.
作为shouldHang
方法是静态同步的,并且我已经进行了类级别的锁定。
我无法理解这种行为。有人可以帮我这个忙吗?
public class Test1 {
synchronized static public void shouldHang() {
System.out.println("Didn't hang, it should've.");
}
static public void main(String args[]) {
Test1 test = new Test1();
synchronized (test.getClass()) {
new Thread(new trylock()).start();
}
}
}
class trylock implements Runnable {
public void run() {
Test1.shouldHang();
}
}
最佳答案
为什么不打印呢?您只有一个线程调用一个同步方法。调用该方法时,主线程已完成执行(并因此释放了锁)。启动线程只会启动它并立即返回,因此事件的顺序为:
主线程获取锁
主线程启动另一个线程
主线程释放锁定(并停止运行)
第二个线程获取锁
第二个线程打印
第二个线程释放锁定(并停止运行)
第二个线程可能会尝试在主线程仍然拥有该锁的同时获取该锁,但这并没有改变任何东西:主线程将其释放,从而使其可用于第二个线程。