我在一个教程中看到了这一点,他们问以下代码是否有问题。在我看来,b()无法访问,因为a()已经可以控制监视器了。我这样想对吗?
public class Test {
public synchronized void a() {
b();
System.out.println("I am at a");
}
public synchronized void b() {
System.out.println("I am at b");
}
}
最佳答案
不,该代码没有问题。
注意两件事:synchronized SomeType foo() { ... }
等效于
SomeType foo() {
synchronized (this) { ... }
}
它锁定封闭类的
this
实例。因此,在您的情况下,a()
和b()
锁定同一件事如果某个线程已经在某个对象的监视器上持有锁,那么它将阻止另一个线程在同一对象上获取锁,但是如果需要,同一线程也可以获取更多锁,这不会受到影响。所以
public synchronized void a() { // acquires lock on this
b(); // also aquires lock on this, but it's ok because it is the same thread
System.out.println("I am at a");
}
当线程在
a()
内部时,其他线程将无法在同一实例上调用a()
或b()
。如果尝试这样做,则必须等到当前线程退出a()
。但是当前线程本身不受影响,它可以对此对象调用任何同步方法,因为它已经持有了锁。关于java - Java与锁关键字同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27465648/