单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)。
本篇文章仅列举单例模式的几种写法。
饿汉式
public class Singleton{
private Singleton(){}
private static Singleton instance = new Singleton();
public Singleton getInstance(){
return instance;
}
}
特点是线程安全,但因在类加载时就完成了初始化,后续可能并没有使用,内存浪费。
懒汉式
public class Singleton{
private Singleton(){}
private static Singleton instance = null;
public Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
特点是延迟了初始化,但在多线程环境下会产生多个实例,线程非安全。
双重检查锁模式
public class Singleton{
private Singleton(){}
private static Singleton instance = null;
public Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
特点是由于JVM在实例化对象的时候会进行优化和指令重排序操作(后续JVM系列文章会详细讨论),可能会出现空指针。
静态内部类
public class Singleton{
private Singleton(){}
private static class InnerClass{
private static Singleton instance = new Singleton();
}
public Singleton getInstance(){
return InnerClass.instance;
}
}
即实现了延迟初始化,又是线程安全的。