Java 同名嵌套锁

Java 同名嵌套锁,java,multithreading,synchronization,mutex,Java,Multithreading,Synchronization,Mutex,如果我有两个锁嵌套 说(我在这里谈论java) synchronized (clientInfMutex) { ... synchronized (clientInfMutex) { //Will this part executable? } } 内部部分是否可执行?问题是,当外部锁获得锁时,内部锁可能无法再次锁定。如果内部部分不可执行,是否有一种机制,如果我已经在外部锁中持有锁,我将能够访问内部锁而不会出现问题?谢谢。是的。 因为线程已经有了锁。 在Ja

如果我有两个锁嵌套 说(我在这里谈论java)

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


  }


}
内部部分是否可执行?问题是,当外部锁获得锁时,内部锁可能无法再次锁定。如果内部部分不可执行,是否有一种机制,如果我已经在外部锁中持有锁,我将能够访问内部锁而不会出现问题?谢谢。

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

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

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

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

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


注意,这是假设
clientInfMutex
在两条语句中指向同一个对象在两个同步块之间,则线程将等待新对象的锁定。

这将正常工作。如果线程已通过
同步
块获得锁定,则可以多次重新获得。此功能称为

请注意,如果
被隐式用作同步器,则此功能也有效:

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

public synchronized void bar() {
}

顺便说一句,示例中的两个代码块正在同一对象上同步,而不是在您所称的同一名称上同步。

这将正常工作。如果线程已通过
synchronized
块获得锁,则它可以多次重新获得锁。此功能被调用

请注意,如果
被隐式用作同步器,则此功能也有效:

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

public synchronized void bar() {
}

顺便说一句,您的示例中的两个代码块在同一个对象上同步,而不是在您所称的同一个名称上同步。

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

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

只测试运行代码会不会更快?这有什么意义内部同步块?当你到达它时,你已经持有了锁…仅仅测试运行你的代码不是更快吗?内部同步块的意义是什么?当你到达它时,你已经持有了锁。。。