在设计Singleton类时,是否需要使用双重检查?为什么我不能在if
块中添加synchronize
条件?还是有任何突破?
public static Singleton getInstance() {
synchronized(Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
return singleton;
}
答案 0 :(得分:1)
不需要在synchronized
之外进行检查,但只要您多次拨打getInstance()
,它就会提高效果。使用synchronized
非常昂贵,但只检查== null
非常便宜。通常,当您致电getInstance()
时,系统已经构建了一个实例,因此,如果您始终首先检查== null
,则可以最大限度地减少使用synchronized
的次数。
答案 1 :(得分:0)
安全的方法是使用枚举。这是示例
public enum SingletonEnum {
INSTANCE;
int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
主要课程
public class EnumDemo {
public static void main(String[] args) {
SingletonEnum singleton = SingletonEnum.INSTANCE;
System.out.println(singleton.getValue());
singleton.setValue(2);
System.out.println(singleton.getValue());
}
}