Java对象锁定:调用其他方法时死锁?

usi*_*mon 4 java multithreading deadlock locking

如果我在两个方法中使用synchronize(this)而另一个调用另一个方法,那么我是否会陷入死锁状态,或者它是否会起作用,因为线程已经拥有了锁?

想象下面的课程:

public class Test {
  public void foo() {
    synchronize(this) {
      bar();
    }
  }

  public void bar() {
    synchronize(this) {
      // do something
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,有两种方法foo和bar,它们都依赖于同步.

当调用foo()时,将获得一个锁(this); bar会在foo调用时尝试执行相同的操作(从而导致死锁),还是会意识到锁已经被同一个线程获取了?

希望我的解释或多或少清楚;-)

Tud*_*dor 10

synchronized块是可重入的(实际上,Java监视器是可重入的,非常清楚),因此在您的情况下不会发生死锁.

根据文件:

回想一下,线程无法获取另一个线程拥有的锁.但是一个线程可以获得它已经拥有的锁.