单例设计模式

Posted yotop

tags:

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

介绍

  单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:

1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。

2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。


代码


1、饿汉式单例



2、懒汉式单例


单例设计模式


3、加锁(synchronized)单例


单例设计模式


4、双重检查锁


单例设计模式


5、静态内部类单例


单例设计模式


6、枚举类单例



思考题:

   1、双重检查锁中为什么要两次判断==null?volatile关键字在此处起了什么作用?

   2、静态内部类是通过什么机制保证线程安全性与延迟加载的?

   3、如何破坏一个单例?



tips:

 1、JVM 创建对象的时候,分为三步 ,如下图

上面3行伪代码中的2和3之间,可能会被重排序,当声明对象的引用为volatile后,之前的3行伪代码中的2和3之间的重排序,在多线程环境中将会被禁止。

 2、内部类里创建对象的实例,这样只要我们的应用中不使用这个内部类StaticInnerSingleton,那么jvm虚拟机他就不会去加载这个类,也就不会去创建我们所要创建的单例staticInnerHolderSingleton,这里静态内部类,就完成了懒汉式的延迟加载,同时又保证了线程安全

 3、反射攻击、序列化攻击


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

深入理解设计模式-单例模式(饿汉单例模式懒汉单例模式双锁单例模式)

Java模式设计之单例模式(二)

设计模式之单例模式

Java设计模式 - 单例模式

java设计模式-单例模式

Java设计模式-单例模式