首先我们要先了解下单例的四大原则:
- 构造私有。
- 以静态方法或者枚举返回实例。
- 确保实例只有一个,尤其是多线程环境。
- 确保反序列换时不会重新构建对象。
我们常用的单例模式有:
饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式.
我们说下饿汉模式,重点说下静态内部类模式
- 饿汉模式
public class SingleTon{ private static SingleTon INSTANCE = new SingleTon(); private SingleTon(){} public static SingleTon getInstance(){ return INSTANCE; }}
饿汉模式在类被初始化时就已经在内存中创建了对象,以空间换时间,故不存在线程安全问题。
2. 静态内部类模式
public class SingleTon{
private SingleTon(){}
private static class SingleTonHolder{
private static SingleTon INSTANCE = new SingleTon();
}
public static SingleTon getInstance(){
return SingleTonHold+er.INSTANCE;
}
}
静态内部类优点:
- 延迟加载- 静态内部类使用时候才会加载。
- 线程安全
静态内部类的优点是:外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。即当SingleTon第一次被加载时,并不需要去加载SingleTonHolder,只有当getInstance()方法第一次被调用时,才会去初始化INSTANCE,第一次调用getInstance()方法会导致虚拟机加载SingleTonHolder类,这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。