java - 同步方法中的重入

标签 java multithreading locking reentrancy

同步方法是否可重入

我有这个代码:

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

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

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

[编辑]:线程 A 每次调用它后是否都会运行 m2() ?或者它是否会留下,以便线程 A线程 B 都能为自己的目标而竞争?

最佳答案

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

关于java - 同步方法中的重入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64291188/

相关文章:

c# - 当多个线程试图同时在Winforms中使用Invoke更新表单控件时,会发生什么情况?

dictionary - 使用 sync.Map 确保只有一个 goroutine 正在运行

python - 使用Python的asyncio实现时间锁

ruby-on-rails - rails - 实现一个简单的锁来防止用户同时编辑相同的数据

java - EJB 和使用二进制文件 - 最佳实践

java - 使用@Async 注释的方法未被异步调用,并且在应用程序上下文启动之前收到 ContextRefreshedEvent

ios - objc_sync_enter/objc_sync_exit 不适用于 DISPATCH_QUEUE_PRIORITY_LOW

multithreading - 使用 C++0x 开发多线程程序的好资源

java - JButton 以编程方式显示工具提示 : actionMap. get ("postTip") 为空

java - java.lang.NoClassDefFoundError:javax/security/auth/kerberos/KeyTab