单例模式是设计模式中总容易理解,而且使用次数比较多的模式,每每在面试中会被问到。在这里我简述下本身的思路。但愿能对你有所帮助。 ###懒汉式 单例模式面试
public class Single {
private static Single instance;
private Single () {}
public static Single getInstance () {
if (instance == null) {
instance = new Single();
}
return instance;
}
}
复制代码
上面这种,是咱们众所周知的,每每教科书上也是这么写的,可是这种是线程不安全的,那么咱们来看下一个。设计模式
public static synchronized Single getInstance() {
if (instance == null) {
instance = new Single();
}
return instance;
}
复制代码
这种相对第一种来讲,就安全了不少,可是它并不高效。安全
双重检验锁模式(double checked locking pattern),是一种使用同步块加锁的方法。被称其双重检验锁。是由于会有两次检验instance == null
,一次是在同步块外,一次是在同步块内。bash
public static Single getInstance () {
if(instance == null) {
synchronized (Single.class) {
if(instance ==null) {
instance = new Single();
}
}
}
return instance;
}
复制代码
这样是否是很完美了,但是还有问题,咱们来看下 JVM 对instance = new Single()
这句话作了什么函数
public class Single() {
private volatile static Single instance; // 声明成 volatile
private Single () {}
public static Single getInstance () {
if (instance == null) {
synchronized (Single.class) {
if(instance == null) {
instance = new Single();
}
}
}
return instance;
}
}
复制代码
public class Single{
//类加载时就初始化
private static final Single instance = new Single();
private Single(){}
public static Single getInstance(){
return instance;
}
}
复制代码
public class Single {
private static class SingleHolder {
private static final Single INSTANCE = new Single();
}
private Single (){}
public static final Single getInstance() {
return SingleHolder.INSTANCE;
}
}
复制代码
用枚举写单例实在太简单了!这也是它最大的优势。下面这段代码就是声明枚举实例的一般作法。优化
public enum EasySingle{
INSTANCE;
}
复制代码