Java面试手写单例模式的三种实现
自己在Java后台面试的时候遇到了这个代码问题,当时不知道是什么来的,所以经过学习后自己总结了以下单例模式实现方法。
单例模式实现方法:
-
饿汉式单例:在类初始化时就已经自行实例化了
public class Singleton { //私有静态成员变量 private static Singleton instance = new Singleton(); //私有构造方法 private Singleton(){} //公有静态访问方法 public static Singleton getInstance() { return instance; } }
当然可以改为静态方块来执行实例化语句:
private static Singleton instance = null;
static{
instance = new Singleton();
}
-
懒汉式单例:在第一次调用实例的时候才实例化
public class Singleton { //私有静态成员变量 private static Singleton instance = null; //私有构造方法 private Singleton(){} //公有静态访问方法,注意加了一个synchronized关键字确保线程安全 public static synchronized Singleton getInstance() { if(instance == null) instance = new Singleton(); return instance; } }
-
双重校验法:(线程安全效率高)
public class Singleton { //私有静态成员变量,加上了volatile关键字确保可见性 private volatile static Singleton instance = null; //私有构造方法 private Singleton(){} //公有静态访问方法 public static Singleton getInstance() { if(instance == null){ //判断instance为null采取获取锁,不用每次获取锁 synchronized (Singleton.class){ //获取锁这里利用到volatile关键字的可见性,再次判断空 if(instance == null) //确保获取锁后线程安全,此时instance真的为空,才去创建实例 instance = new Singleton(); } } return instance; } }
注意instance用了volatile保证可见性,getInstance方法用了同步块,获得锁是整个类的。