我的理解是,当一个对象方法被“同步”时,该方法一次只允许一个线程。我对此进行了测试,它有效。
但是最近有人告诉我,线程必须获得控制权才能访问同步方法的“锁”是“对象锁”。这意味着该对象的所有方法(同步或非同步)都以同步方式有效运行。
我用 synchronized void method1();
和 void method2();
进行了测试,看起来很多线程都能够进入 method2
同时进行。
这个家伙指的这个“对象锁”是什么,它是如何工作的?
最佳答案
他的意思是,如果你有两个同步方法,它们将相互同步,而不仅仅是单独同步。这是因为在调用该方法的实例上持有对象锁。
换句话说,如果您有两个同步方法 foo()
和 bar()
,则没有线程可以在同时调用 bar()
另一个线程正在调用 foo()
。
如果把定义写出来就很容易看出来。同步方法
public synchronized void foo() {
stuff;
}
相当于:
public void foo() {
synchronized(this) {
stuff;
}
}
对于没有关联实例的方法(即静态方法),将锁定类实例。
关于java - 在 Java 中,当对象中的一个方法是 'synchronized' 时,所有方法都是 'synchronized' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232372/