繁体   English   中英

可重入同步-解锁调用的同步方法

[英]Reentrant Synchronization- Unlocking of called synchronized method

void method1() {
     synchronized(this) {  // Acquires intrinsic lock
      method2();
    }   
}

void method2() {
     synchronized(this) {} // Acquires same lock due to Reentrant synchronization
}

第一次锁是在method1中获取的,它在第二次获取相同锁时调用同步method2。

现在我的疑问是何时在method2()中的同步块结束时,解锁是否在此首次发生,并返回到method1()的同步块中,在第二次再次发生解锁。

是否像ReentrantLock一样在内部管理锁计数?

是否像ReentrantLock一样在内部管理锁计数?

是。 JLS第17.1节开始 -强调我的。

Java编程语言提供了多种线程之间通信的机制。 这些方法中最基本的是同步,它是使用监视器实现的。 Java中的每个对象都与一个监视器关联,线程可以锁定或解锁监视器。 一次只能有一个线程在监视器上保持锁。 尝试锁定该监视器的所有其他线程将被阻止,直到它们可以在该监视器上获得锁定为止。 线程t可以多次锁定特定的监视器。 每次解锁都会逆转一次锁定操作的效果

是的,在内部,jdk跟踪重新进入。

根据oracle文档:

回想一下,一个线程无法获取另一个线程拥有的锁。 但是线程可以获取它已经拥有的锁。 允许一个线程多次获取相同的锁将启用重入同步。 这描述了一种情况,其中同步代码直接或间接调用一个也包含同步代码的方法,并且两组代码使用相同的锁。 如果没有可重入同步,则同步代码将不得不采取许多其他预防措施,以避免线程导致自身阻塞。

请参阅了解详情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM