同步方法中的重入

Reentrancy in synchronized methods

同步方法是否可重入

我有这个代码:

public class Main {
    
    synchronized void m1() {
        //some code
        m2();
        //some code
    }
    
    synchronized void m2(){
        //some code
    }    
    
}

假设两个线程(线程 A 和线程 B)同时尝试访问 m1()线程 A 首先获取 lock。一段时间后 线程 A 调用 m2(),它也在同一对象上同步。

由于我不想做任何猜测,有人可以告诉我这个吗:是否可以保证 线程 A 调用 m2() 时会发生什么?我的意思是,一旦 线程 A 调用 m2(),它会 'leave lock' 吗?因为从技术上讲它离开了方法的框架,所以它也会离开锁吗?

[编辑]:线程 A 是否每次调用后都会到达 运行 m2()?还是它会留下 lock 所以 线程 A线程 B 都会为他们的目标而竞争?

在 Java 中,锁是可重入的。如果线程 A 持有锁,那么它可以开始执行方法 m1。最终它会调用方法m2,因为线程A已经持有锁,它不需要再次重新获取锁来执行方法m2。在内部,锁保留所有者字段以跟踪此信息。即使锁已经持有,因为 m2 的调用者是锁的所有者,所以访问被授予。这种设计策略可以防止死锁。