我写了下面的程序,据我了解,它不应打印

'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();
        }
    }

最佳答案

为什么不打印呢?您只有一个线程调用一个同步方法。调用该方法时,主线程已完成执行(并因此释放了锁)。启动线程只会启动它并立即返回,因此事件的顺序为:


主线程获取锁
主线程启动另一个线程
主线程释放锁定(并停止运行)
第二个线程获取锁
第二个线程打印
第二个线程释放锁定(并停止运行)


第二个线程可能会尝试在主线程仍然拥有该锁的同时获取该锁,但这并没有改变任何东西:主线程将其释放,从而使其可用于第二个线程。

10-01 17:58
查看更多