单例类中的双重锁定真的需要吗?

  • 本文关键字:真的 锁定 单例类 java
  • 更新时间 :
  • 英文 :


在设计单例类时,是否需要使用双重检查?为什么我不能在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());
}
}

最新更新