【问题标题】:synchorised static method vs synchronise class object同步静态方法与同步类对象
【发布时间】:2013-08-06 11:17:45
【问题描述】:

假设我的Foo 类看起来像这样

public class Foo
{
    public static void func_1() { /* do something */ }
    public static void func_2() { /* do something */ }
}

我的Bar 班级看起来像这样

public class Bar
{
    public void method_1()
    {
         synchronized(Foo.class)
         {
             Foo.func_1();
         } 
    }          
}

现在我可以将Foo.func_1Foo.func_2 声明为synchronized,而不是将Foo.class 对象锁定在Bar.method_1 中,并且仍然存档相同的目的吗?

谢谢

【问题讨论】:

  • 同一个对象用于同步,但使用同步的静态方法,调用者不执行同步,因此技术可能更可取(调用者永远不会忘记执行同步)。

标签: java static synchronize


【解决方案1】:

静态同步方法获得类的锁定,并通过锁定 Foo.class ,您正在做同样的事情。所以是的,他们会实现同样的目标。

【讨论】:

    【解决方案2】:

    是的,他们实现了同样的目标——锁定Foo.class。这是Java Language Specification, Section 8.4.3.6的相关摘录:

    对于类(静态)方法,与该类关联的监视器 使用方法类的对象。

    Foo 类中的静态func_1()func_2() 方法上使用synchronized 会隐式锁定Foo.class,而synchronized(Foo.class) 会显式锁定它。

    【讨论】:

    • 干得好,我不知道这一点,我已经使用该语言有一段时间了。通常不要在静态类上同步...
    • 哪种做法更好(即更简洁、更易阅读)?
    • 我相信知道static synchronized 方法会锁定其类的Class 对象是标准的Java 知识。调用者更容易阅读 Javadocs 以查看方法是 synchronized,而不是深入研究您的实际代码以查看线程安全是如何实现的。所以我想说让方法同步是更好的做法。
    【解决方案3】:

    是的,它们几乎相同。唯一的区别是:在一种情况下,锁是在调用方法之前获取的,而在另一种情况下,锁是稍后获取的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多