java - 类级别锁未按预期工作

标签 java synchronization

我编写了以下程序,根据我的理解,它不应该打印

'没有挂起,它应该挂起。因为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();
        }
    }

最佳答案

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

  1. 主线程获取锁
  2. 主线程启动另一个线程
  3. 主线程释放锁(并停止运行)
  4. 第二个线程获取锁
  5. 第二个线程打印
  6. 第二个线程释放锁(并停止运行)

第二个线程可能在主线程仍然拥有锁时尝试获取锁,但这不会改变任何内容:主线程释放它,从而使其可用于第二个线程。

关于java - 类级别锁未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44173325/

相关文章:

java - 按字母顺序排序 ArrayList

java - 在 synchronized block 中使用 Vector 有什么区别吗?

windows - 为什么 WaitForSingleObject(INVALID_HANDLE_VALUE, INFINITE) 会阻塞?

deployment - Java bundle JRE

java - 无法解析 : lifecycle-runtime-2. 2.0

java - 如何在 Java 中延迟 MouseOver?

java - 使用 jsoup 提取价格

synchronization - 如何在没有在远程服务器上安装 Unison 的情况下同步文件?

python - python中的多线程真的需要同步吗?

linux - 为什么在 Linux 中 spin_lock 和 spin_unlock 之间的中断被禁用?