我在一个教程中看到了这一点,他们问以下代码是否有问题。在我看来,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/

10-11 22:35
查看更多