带有synchronized关键字的Java锁
我在一个教程中看到了这一点,他们问下面的代码是否有问题。在我看来,b()似乎无法访问,因为a()已经控制了监视器。我这样想对吗带有synchronized关键字的Java锁,java,synchronize,Java,Synchronize,我在一个教程中看到了这一点,他们问下面的代码是否有问题。在我看来,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
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) { ... }
}
它锁定封闭类的这个
实例。因此,在您的例子中,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()
。但是当前线程本身不受影响,它可以调用此对象上的任何同步方法,因为它已经持有锁不,这个代码没有问题。 注意两件事:
synchronized SomeType foo(){…}
相当于
SomeType foo() {
synchronized (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()
。但是当前线程本身不受影响,它可以调用此对象上的任何同步方法,因为它已经持有锁不,这个代码没有问题。 注意两件事:
synchronized SomeType foo(){…}
相当于
SomeType foo() {
synchronized (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()
。但是当前线程本身不受影响,它可以调用此对象上的任何同步方法,因为它已经持有锁不,这个代码没有问题。 注意两件事:
synchronized SomeType foo(){…}
相当于
SomeType foo() {
synchronized (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()
。但是当前线程本身不受影响,它可以调用此对象上的任何同步方法,因为它已经持有锁有人在没有任何解释的情况下否决了这个?我也不知道答案,想解释一下吗?我不知道投票被否决的原因,但似乎OP并没有试过。有人在没有任何解释的情况下否决了这个?我也不知道答案,想解释一下吗?我不知道投票被否决的原因,但似乎OP并没有试过。有人在没有任何解释的情况下否决了这个?我也不知道答案,想解释一下吗?我不知道投票被否决的原因,但似乎OP并没有试过。有人在没有任何解释的情况下否决了这个?我也不知道答案,想解释一下吗?我不知道投反对票的原因,但似乎OP并没有试过。