在设计单例类时,是否需要使用双重检查?为什么我不能在synchronize
块中也放置一个if
条件?还是有什么中断?
public static Singleton getInstance() {
synchronized(Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
return singleton;
}
不需要在synchronized
之外进行检查,但是,只要您多次调用getInstance()
,它就会提高性能。使用synchronized
非常昂贵,但仅检查== null
非常便宜。通常,当您调用getInstance()
时,已经构造了一个实例,因此如果您总是先检查== null
,则可以最大限度地减少使用synchronized
的次数。
安全的方法是使用枚举。这是示例
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());
}
}