Java 同名嵌套锁
如果我有两个锁嵌套 说(我在这里谈论java)Java 同名嵌套锁,java,multithreading,synchronization,mutex,Java,Multithreading,Synchronization,Mutex,如果我有两个锁嵌套 说(我在这里谈论java) synchronized (clientInfMutex) { ... synchronized (clientInfMutex) { //Will this part executable? } } 内部部分是否可执行?问题是,当外部锁获得锁时,内部锁可能无法再次锁定。如果内部部分不可执行,是否有一种机制,如果我已经在外部锁中持有锁,我将能够访问内部锁而不会出现问题?谢谢。是的。 因为线程已经有了锁。 在Ja
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中的每个对象实例都有一个锁引用。这意味着您使用的双锁实际上只锁定对象一次。这也意味着当您处于被对象锁定的块中时,再次锁定没有效果。只测试运行代码会不会更快?这有什么意义内部同步块?当你到达它时,你已经持有了锁…仅仅测试运行你的代码不是更快吗?内部同步块的意义是什么?当你到达它时,你已经持有了锁。。。