最简单的两个单例模式:饿汉式与懒汉式
所有单例模式的构造方法都需要私有化,禁止被实例化,都是通过内部提供方法来给出一个实例,由于不能实例化,该类提供实例的方法必须是静态方法;
饿汉式:类加载时就初始化,很是急切,没有进行使用就new对象,内存浪费,但是没有锁,效率高,还是线程安全的;
public class Singleton {
/* 私有构造方法,防止被实例化 */
private Singleton() {
}
/* 持有私有静态实例 是否考虑在static加final */
private static Singleton instance = new Singleton();
public static Singleton getInstance (){
return instance;
}
}
懒汉式:最初形态,好处是使用时才进行实例化,但是多线程下要保证安全的,必须加synchronized,效率较低;
public class Singleton {
//私有构造
private Singleton (){}
//静态成员变量
private volatile static Singleton instance;
//提供实例的静态方法
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
双检锁/双重校验锁
对懒汉效率问题的考量,进行效率上的优化
public class Singleton {
//私有构造
private Singleton (){}
private volatile static Singleton singleton;
public static Singleton getSingleton() {
if (singleton == null) {
//加锁前后都校验,提升效率或者抽出另一个加锁的方法
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
静态内部类
public class Singleton {
//私有构造
private Singleton (){}
//静态内部类维护单例的创建
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}