我在教程中看到了这个,他们询问以下代码是否有问题。对我来说,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");
}
}
最佳答案
不,该代码没有问题。 注意两点:
同步 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使用synchronized关键字进行锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27465648/