同步方法是否可重入?
我有这个代码:
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/