我在一个教程中看到了这一点,他们问下面的代码是否有问题。在我看来,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");
}
}发布于 2014-12-14 02:22:07
不,那个代码没有问题。注意两件事:
synchronized SomeType foo() { ... }等价于
SomeType foo() {同步(此){.}}
它锁定封闭类的this实例。因此,在您的例子中,a()和b()锁定的是相同的东西。a()中时,没有其他线程能够在同一个实例上调用a()或b()。如果他们试图这样做,他们将不得不等待到当前线程退出a()。但是当前线程本身不受影响,它可以调用该对象上的任何同步方法,因为它已经持有锁。发布于 2014-12-14 02:20:35
不,你错了。线程控制监视器,而不是方法,因此它能够根据需要跟踪执行到同一对象上同步的方法。
https://stackoverflow.com/questions/27465648
复制相似问题