单例模式的多种实现方法 Java中的双重检查锁(double checked locking)

最基本写法,也叫懒汉写法(线程不安全):

public class Singleton {

  private static Singleton singleton;

  private Singleton() {
  }

  public static Singleton getInstance() {
   if (singleton == null) {
    singleton = new Singleton();
   }
   return singleton;
  }
}

饿汉式写法(因为是静态的,再项目启动的时候就加载好了,每一次调用都是同一个,不存在线程安全问题):

public class Singleton {
   private static Singleton instance = new Singleton();
   private Singleton (){}
   public static Singleton getInstance() {
   return instance;
   }
}

例如:

public class Test {
    public static void main(String[] args) {
        Singleton.getInstance();
        Singleton.getInstance();
    }
}
class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton (){
        System.out.println("我调用了");
    }
    public static Singleton getInstance() {
        return instance;
    }
}

结果:

 静态内部类:

public class Singleton {
   private static class SingletonHolder {
   private static final Singleton INSTANCE = new Singleton();
   }
   private Singleton (){}
   public static final Singleton getInstance() {
   return SingletonHolder.INSTANCE;
   }
}

枚举:

public enum Singleton {
   INSTANCE;
   public void whateverMethod() {
   }
}

这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,jdk1.5中才加入enum特性

双重校验锁:

public class Singleton {
   private volatile static Singleton singleton;
   private Singleton (){}
   public static Singleton getSingleton() {
   if (singleton == null) {
       synchronized (Singleton.class) {
       if (singleton == null) {
           singleton = new Singleton();
       }
       }
   }
   return singleton;
   }
}

 关于volatile关键字可以参考:

Java中的双重检查锁(double checked locking)

猜你喜欢

转载自www.cnblogs.com/lzghyh/p/12673186.html