真的需要在Singleton类中进行双重锁定吗?

时间:2018-05-02 20:17:31

标签: java

在设计Singleton类时,是否需要使用双重检查?为什么我不能在if块中添加synchronize条件?还是有任何突破?

 public static Singleton getInstance() {
    synchronized(Singleton.class) {    
    if (singleton == null) {
        singleton = new Singleton();
      }
    }

   return singleton;
}

2 个答案:

答案 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());

    }

}