【问题标题】:Nested Lock with the same name同名嵌套锁
【发布时间】:2012-09-30 11:18:25
【问题描述】:

如果我有两个嵌套的锁 说(我这里是关于java的)

synchronized (clientInfMutex) {
...
    synchronized (clientInfMutex) {
        //Will this part executable?


  }


}

内部部分可以执行吗?担心的是当外锁获得锁时,内锁可能无法再次锁定锁。如果内部部分不可执行,是否有一种机制,如果我已经持有外部锁中的锁,我将能够毫无问题地访问内部锁?谢谢。

【问题讨论】:

  • 测试运行代码不是更快吗?
  • 内部同步块的意义何在?当你到达它时,你已经握住了锁......

标签: java multithreading synchronization mutex


【解决方案1】:

是的。 因为线程已经拥有了锁。 在 Java 中,本机锁是可重入的

每次 JVM 遇到一个同步块时,它都会检查它是否拥有该锁,如果没有,则等待该锁,否则它会为该锁增加一个内部计数器,并执行封闭的块

请注意,这是假设clientInfMutex 在两个语句中都指向同一个对象。例如,如果您在两个同步块之间执行了clientInfMutex = new Object(),那么您的线程将等待新对象的锁定。

【讨论】:

    【解决方案2】:

    这会很好用。如果线程已经通过synchronized块获得了锁,它可以多次重新获得。此功能称为reentrant synchronization

    请注意,如果 this 被隐式用作同步器,这也有效:

    public synchronized void foo() {
        bar();  //will NEVER block
    }
    
    public synchronized void bar() {
    }
    

    顺便说一句,您的示例中的两个代码块在同一个 object 上同步,而不是在同一个 name 上同步。

    【讨论】:

      【解决方案3】:

      Java 中的每个 Object 实例都拥有一个锁引用。这意味着您使用的双锁实际上只锁定对象一次。这也意味着当你在一个被对象锁定的块中时,再次锁定是没有效果的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-05
        • 2023-01-08
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        相关资源
        最近更新 更多