在Java中,当对象中的一个方法被同步时#39;是所有方法同步'?

时间:2014-04-22 23:54:25

标签: java multithreading

我的理解是当对象方法同步时,那么该方法中一次只允许一个线程。我测试了它并且它有效。

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

我使用synchronized void method1();void method2();对其进行了测试,看起来很多线程都可以同时输入method2

这是什么"对象锁定"这家伙指的是它是如何运作的?

1 个答案:

答案 0 :(得分:8)

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

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

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

public synchronized void foo() { 
  stuff;
}

相当于:

public void foo() { 
  synchronized(this) {
    stuff;
  }
}

对于没有关联实例的方法(即静态方法),而是在Class实例上保存锁。