【问题标题】:Java Static Synchronized [duplicate]Java静态同步[重复]
【发布时间】:2011-09-20 14:15:55
【问题描述】:

可能重复:
How do synchronized static methods work in Java?

谁能让我理解以下两个功能之间的根本区别:

public static void synchronized f() {… } 

public void synchronized f() {… }

【问题讨论】:

标签: java multithreading


【解决方案1】:

我认为:

public void synchronized f() {… } 在对象本身上同步 (this)

public static void synchronized f() {… } 同步对象的 Class 实例(object.getClass()SomeClass.getClass

我错了

【讨论】:

  • this.getClass() 如果是静态方法,则没有任何意义。我想你的意思是SomeClass.class
  • @Mark 是的,谢谢。我将编辑我的帖子。反正我是对的吗?
【解决方案2】:

假设方法 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 对象。
【解决方案3】:

如果是

public void synchronized f(){...}

同步是每个封闭类的实例。这意味着多个线程可以在类的不同实例上调用f

对于

public static void synchronized f(){...}

一次只有一个线程可以调用该方法,与封闭类的实例数量无关。

从技术上讲,第一个示例中synchronized 获取的监视器是对象实例的监视器,而第二个示例中获取的监视器是Class 对象的监视器。

请注意,如果您在不同的ClassLoaders 中有同名的类,则共享同一个监视器,但这是您不太可能遇到的细节。

【讨论】:

  • 在Java中是否有“同步”的替代品,比如我们有相同的线程访问限制,而不使用“同步”关键字?
  • 您可以通过使用Lock 实现之一获得与synchronized 相同的语义。
【解决方案4】:

在“静态同步”方法中,同步的锁在类本身上;在“同步”方法中,锁定在对象上。请注意,这意味着“静态同步”方法不会被正在运行的“同步”方法阻塞,反之亦然。欲了解更多信息,请参阅:http://geekexplains.blogspot.com/2008/07/synchronization-of-static-and-instance.html

【讨论】:

    猜你喜欢
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多