同步方法中的重入
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 的调用者是锁的所有者,所以访问被授予。这种设计策略可以防止死锁。
同步方法是否可重入?
我有这个代码:
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 的调用者是锁的所有者,所以访问被授予。这种设计策略可以防止死锁。