同步:为什么优先锁定私有最终静态对象而不是 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 实例的任何其他代码也可以锁定同一对象,从而引入意外的同步问题,例如死锁由锁顺序违规引起。
简单问题:
为什么首选这个:
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 实例的任何其他代码也可以锁定同一对象,从而引入意外的同步问题,例如死锁由锁顺序违规引起。