我编写了以下程序,根据我的理解,它不应该打印
'没有挂起,它应该挂起。
因为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();
}
}
最佳答案
为什么不应该打印它?您有一个调用单个同步方法的线程。当调用该方法时,主线程已完成执行(并因此释放了锁)。启动一个线程只是启动它并立即返回,所以事件的顺序是:
- 主线程获取锁
- 主线程启动另一个线程
- 主线程释放锁(并停止运行)
- 第二个线程获取锁
- 第二个线程打印
- 第二个线程释放锁(并停止运行)
第二个线程可能在主线程仍然拥有锁时尝试获取锁,但这不会改变任何内容:主线程释放它,从而使其可用于第二个线程。
关于java - 类级别锁未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44173325/