单例模式 共 懒汉式 饿汉式 双重检测锁 静态(static)内部类 枚举类5种实现方式
现在说每个方式的优缺点
首先看一个大家随手就能写的 单例模式(懒汉式式的写法)
但这个是非线程安全的
为了实现线程安全 懒汉式的升级写法
但这其实还是保证不了线程安全的
我们再进一步升级
这个还是有问题的
那懒汉究竟怎样才能线程安全呢
那就进入到进化变异版了
双重检测锁
之前很多人 知其一不知其二 ,说它不推荐使用。
但错了 , 是1.5之前不推荐 , 1.5之后已经没这个问题了 。原因:因为jdk又花了,好像是哪个关键字吧----volatile (
new不是个原子操作,后面优化了volatile语义,然后双重变的正常了
) 现在懒汉 和 双重检测锁 说完了
继续饿汉式
饿汉式本身是线程安全的 原因也很简单
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
现在看看代码就知道了
但是饿汉式有个缺点是不能延时加载
再说个静态内部类的实现
这个也是线程安全的 , 并且可以实现延时加载 , 也是最为常用的 。 但是它们都有一个致命缺陷。
对 类的方式都可以被反射 , 被序列化破解
线程安全,调用效率高,但是,不能延时加载
能不能延时加载 调用效率 和 线程安全问题 。是你考虑使用何种单例实现的考量
静态内部类方式 也是可以被破解的
如果你的项目是内部项目 没必要非得使用枚举式 , 毕竟它不能够延时加载