void method1() {
synchronized(this) { // Acquires intrinsic lock
method2();
}
}
void method2() {
synchronized(this) {} // Acquires same lock due to Reentrant synchronization
}
在method1中获取第一次锁定,该方法调用synchronized方法2,第二次获得相同的锁定。
现在我的疑问是,当method2()中的synchronized块结束时,第一次发生解锁并返回到method1()的synchronized块,再次解锁第二次发生。
它是否在内部管理像ReentrantLock中的锁定计数?
答案 0 :(得分:3)
它是否在内部管理像ReentrantLock中的锁定计数?
是。来自JLS section 17.1 - 强调我的。
Java编程语言提供了多种线程间通信机制。这些方法中最基本的是同步,它是使用监视器实现的。 Java中的每个对象都与一个监视器相关联,一个线程可以锁定或解锁。一次只有一个线程可以锁定监视器。尝试锁定该监视器的任何其他线程都将被阻止,直到它们可以获得该监视器上的锁定为止。线程
t
可以多次锁定特定监视器; 每次解锁都会逆转一次锁定操作的影响。
答案 1 :(得分:2)
是的,内部jdk跟踪重入。
根据oracle docs:
回想一下,线程无法获取另一个线程拥有的锁。但是一个线程可以获得它已经拥有的锁。允许线程多次获取相同的锁可启用重入同步。这描述了一种情况,其中同步代码直接或间接地调用也包含同步代码的方法,并且两组代码使用相同的锁。如果没有可重入同步,同步代码必须采取许多额外的预防措施,以避免线程导致自身阻塞。
有关详细信息,请参阅this。