同步:为什么首选锁定私有的最终静态对象而不是类的类对象?

Jos*_*lds 6 java multithreading synchronization

简单的问题:

为什么这是首选:

public class Foo {

    final private static Object foo = new Object();

    public static void doSomething() {
        synchronized(Foo.foo) {
            //code
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对此:

public class Foo {

    public static void doSomething() {
        synchronized(Foo.class) {
            //code
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或这个:

public class Foo {

    public synchronized static void doSomething() {
        //code
    }
}
Run Code Online (Sandbox Code Playgroud)

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

yol*_*ole 6

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