在Java中,当一个对象中的一个方法被"同步"时,所有方法都是"同步的"吗?

Rob*_*ume 1 java multithreading

我的理解是当对象方法"同步"时,那么该方法中只允许一次使用一个线程.我测试了它并且它起作用了.

但最近有人告诉我,线程必须获得控制才能访问同步方法的"锁定"是"对象锁定".意味着对象的所有方法(已同步或未同步)有效地以同步方式运行.

我用synchronized void method1();和测试了,并且void method2();看起来许多线程能够同时进入method2.

什么是这个人所指的"对象锁定"以及它是如何工作的?

tha*_*guy 8

他的意思是,如果你有两个同步的方法,它们将彼此同步,而不仅仅是单独的.这是因为对象锁被保存在调用该方法的实例上.

换句话说,如果您有两个同步方法,foo()并且在另一个线程正在调用时bar()没有线程可以bar()调用foo().

如果你写出定义,这很容易看出.同步方法

public synchronized void foo() { 
  stuff;
}
Run Code Online (Sandbox Code Playgroud)

相当于:

public void foo() { 
  synchronized(this) {
    stuff;
  }
}
Run Code Online (Sandbox Code Playgroud)

对于没有关联实例的方法(即静态方法),将在Class实例上保持锁定.