Table of Contents
单例模式定义
单例模式是设计模式当中比较常见的一个软件设计模式。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类在整个系统当中只有一个对象实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。
单例模式的几种实现方式
单例模式要保证系统中只有一个实例,在单线程情况下实现比较轻松,但是考虑并发情况的话,则实现的时候就需要做特殊处理。
推荐的方式如下:
静态内部类
public class SingletonInnerStaticClass {
//线程安全,静态内部类
private SingletonInnerStaticClass(){
}
/*
通过静态内部类来实现
只要应用中不使用内部类,JVM就不会去加载这个单例类,也就不会创建单例对象,
从而实现懒汉式的延迟加载。也就是说这种方式可以同时保证延迟加载和线程安全。
只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance
*/
private static class SingletonHolder{
public static SingletonInnerStaticClass instance = new SingletonInnerStaticClass();
}
public static SingletonInnerStaticClass newInstance(){
return SingletonHolder.instance;
}
}
私有构造方法,且只有当程序中去调这个内部类时,JVM才会去加载这个单例对象,也保证了延迟加载。但是在遇到序列化对象时,默认的方式运行得到的结果是多例的。
问题:为什么这种方式是线程安全的?
//todo
枚举类实现方式
class Singleton {
}
//枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用
//只要 EnumSingleton.INSTANCE.getInstance() 即可获得所要实例
enum EnumSingleton {
//有问题
INSTANCE;
private Si