简单问题:
为什么这是首选:
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
}
}
对我来说,这些看起来基本相同,所以我不确定什么是同步访问静态字段的最佳方法,或者为什么一个会比另一个好,但我听说第一个通常是首选。
答案 0 :(得分:6)
这是关于封装。如果您正在锁定私有字段,则没有其他代码可以锁定同一对象。如果您正在锁定类对象或实例,则系统中可以访问类实例的任何其他代码也可以锁定同一对象,从而引入意外的同步问题,例如锁定顺序违规导致的死锁。