【发布时间】:2011-09-20 14:15:55
【问题描述】:
谁能让我理解以下两个功能之间的根本区别:
public static void synchronized f() {… }
和
public void synchronized f() {… }
【问题讨论】:
-
@Oli 链接中的second answer 直接回答了这个问题。
标签: java multithreading
谁能让我理解以下两个功能之间的根本区别:
public static void synchronized f() {… }
和
public void synchronized f() {… }
【问题讨论】:
标签: java multithreading
我认为:
public void synchronized f() {… } 在对象本身上同步 (this)
public static void synchronized f() {… } 同步对象的 Class 实例(object.getClass() 或 SomeClass.getClass)
我错了
【讨论】:
this.getClass() 如果是静态方法,则没有任何意义。我想你的意思是SomeClass.class。
假设方法 f 在 Foo 类中。静态版本将锁定类级别的静态方法调用(getClass() 或 Foo.class 返回的对象)。非静态版本将锁定该类的特定实例,因此可以说:
Foo x = new Foo();
Foo y = new Foo();
// Locks method f of instance x, but NOT for y.
x.f();
在静态实例中,对 f() 的调用将锁定两个版本,因此一次只会执行对 f 的一个方法调用。
【讨论】:
.class 对象。
如果是
public void synchronized f(){...}
同步是每个封闭类的实例。这意味着多个线程可以在类的不同实例上调用f。
对于
public static void synchronized f(){...}
一次只有一个线程可以调用该方法,与封闭类的实例数量无关。
从技术上讲,第一个示例中synchronized 获取的监视器是对象实例的监视器,而第二个示例中获取的监视器是Class 对象的监视器。
请注意,如果您在不同的ClassLoaders 中有同名的类,则不共享同一个监视器,但这是您不太可能遇到的细节。
【讨论】:
Lock 实现之一获得与synchronized 相同的语义。
在“静态同步”方法中,同步的锁在类本身上;在“同步”方法中,锁定在对象上。请注意,这意味着“静态同步”方法不会被正在运行的“同步”方法阻塞,反之亦然。欲了解更多信息,请参阅:http://geekexplains.blogspot.com/2008/07/synchronization-of-static-and-instance.html
【讨论】: