什么是单例模式(下)
Posted 豆豆的杂货铺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是单例模式(下)相关的知识,希望对你有一定的参考价值。
上一篇文章为大家介绍了「单例模式」的基本概念和常见写法。如饿汉式,懒汉式、双重检查机制的单例模式。
虽然上篇文章中给出的最终版单例模式保证了线程安全,但是还是存在一些缺陷的,如何能写出更好的单例模式呢?
简单说下上面的代码:
静态内部类是不允许从外部访问的,只有调用 getInstance 方法时才可访问,同时 instance 实例被初始化。也就是说 Singleton 被加载时并不会初始化 instance,只有静态内部类被加载时才会被初始化,利用的 JDK 中的类加载实现懒加载并确保单例的线程安全。
看起来还不错呢,但是这中写法也存在以上所有方法共有的弊端,无法防止通过反射构建对象。
让我们看看是如何通过反射构建不同对象的。
可以简单概括为三个步骤
获取类的构造器。
设置为可访问状态。
利用构造器构造对象。
public enum EnumSingleton {
INSTANCE;
}
我滴个去,一行代码,要不要这么简单。是的你没看错,超级简单好写。
让我们再来执行下刚才的那段反射的代码。
看到了吧,直接抛异常。使用枚举构建单例模式,不仅可以防止通过反射构建对象, 还可以保证线程安全,但是也有一个弊端,就是非懒加载。单例对象就是在枚举类被加载时被实例化的。
--END--
关注「豆豆先生的小屋」,发现更多原创内容。分享技术,畅谈人生,欢迎勾搭!
以上是关于什么是单例模式(下)的主要内容,如果未能解决你的问题,请参考以下文章