什么是单例模式(下)

Posted 豆豆的杂货铺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是单例模式(下)相关的知识,希望对你有一定的参考价值。

上一篇文章为大家介绍了「单例模式」的基本概念和常见写法。如饿汉式,懒汉式、双重检查机制的单例模式。



虽然上篇文章中给出的最终版单例模式保证了线程安全,但是还是存在一些缺陷的,如何能写出更好的单例模式呢?



简单说下上面的代码:


静态内部类是不允许从外部访问的,只有调用 getInstance 方法时才可访问,同时 instance 实例被初始化。也就是说 Singleton 被加载时并不会初始化 instance,只有静态内部类被加载时才会被初始化,利用的 JDK 中的类加载实现懒加载并确保单例的线程安全。


看起来还不错呢,但是这中写法也存在以上所有方法共有的弊端,无法防止通过反射构建对象。


让我们看看是如何通过反射构建不同对象的。


什么是单例模式(下)


可以简单概括为三个步骤

  1. 获取类的构造器。

  2. 设置为可访问状态。

  3. 利用构造器构造对象。



public
enum EnumSingleton {

   INSTANCE;
}


我滴个去,一行代码,要不要这么简单。是的你没看错,超级简单好写。


让我们再来执行下刚才的那段反射的代码。


什么是单例模式(下)


看到了吧,直接抛异常。使用枚举构建单例模式,不仅可以防止通过反射构建对象, 还可以保证线程安全,但是也有一个弊端,就是非懒加载。单例对象就是在枚举类被加载时被实例化的。



--END--





关注「豆豆先生的小屋」,发现更多原创内容。分享技术,畅谈人生,欢迎勾搭!



以上是关于什么是单例模式(下)的主要内容,如果未能解决你的问题,请参考以下文章

什么是单例模式?

单例模式中的饿汉和懒汉模式

设计模式之单例模式

多线程下的单例模式

java的单例模式怎么能保证始终是单例

单例模式