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

时间:2015-03-08 21:27:30

标签: java multithreading synchronization

简单问题:

为什么这是首选:

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

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

1 个答案:

答案 0 :(得分:6)

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