同步:为什么优先锁定私有最终静态对象而不是 class 的 class 对象?

Synchronization: Why is it preferred to lock a private final static object instead of the class's class object?

简单问题:

为什么首选这个:

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
    }
}

?

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

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