【问题标题】:Synchronization: Why is it preferred to lock a private final static object instead of the class's class object?同步:为什么首选锁定私有最终静态对象而不是类的类对象?
【发布时间】:2015-03-08 21:27:29
【问题描述】:

简单的问题:

为什么这是首选:

public class Foo {

    final private static Object foo = new Object();

    public static void doSomething() {
        synchronized(Foo.foo) {
            //code
        }
    }
}

在此:

public class Foo {

    public static void doSomething() {
        synchronized(Foo.class) {
            //code
        }
    }
}

或者这个:

public class Foo {

    public synchronized static void doSomething() {
        //code
    }
}

?

对我来说,这些看起来基本相同,所以我不确定同步访问静态字段的最佳方法是什么,或者为什么一个会比另一个更好,但我听说第一个通常是首选。

【问题讨论】:

    标签: java multithreading synchronization


    【解决方案1】:

    这是关于封装的。如果您锁定私有字段,则没有其他代码可以锁定同一对象。如果您锁定类对象或实例,系统中任何其他有权访问您的类实例的代码也可以锁定同一个对象,从而引入意外的同步问题,例如由锁顺序冲突引起的死锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2023-03-25
      • 2016-05-15
      • 2013-10-25
      • 2011-06-30
      • 1970-01-01
      相关资源
      最近更新 更多