我的理解是当对象方法同步时,那么该方法中一次只允许一个线程。我测试了它并且它有效。
但我最近被告知"锁定"线程必须获得访问同步方法的控制权是"对象锁定"。意味着对象的所有方法(已同步或未同步)有效地以同步方式运行。
我使用synchronized void method1();
和void method2();
对其进行了测试,看起来很多线程都可以同时输入method2
。
这是什么"对象锁定"这家伙指的是它是如何运作的?
答案 0 :(得分:8)
他的意思是,如果你有两个同步的方法,它们将彼此同步,而不仅仅是单独的。这是因为对象锁被保存在调用该方法的实例上。
换句话说,如果您有两个同步方法foo()
和bar()
,则当另一个线程正在调用bar()
时,没有线程可以调用foo()
。
如果你写出定义,这很容易看出来。同步方法
public synchronized void foo() {
stuff;
}
相当于:
public void foo() {
synchronized(this) {
stuff;
}
}
对于没有关联实例的方法(即静态方法),而是在Class实例上保存锁。