什么是单例模式/h2>
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(所以构造器要私有化)。
一:饿汉式
饿汉式上来就实例化了,非常的消耗内存,所有就有了懒汉式。
二:懒汉式
懒汉式只有在被调用的时候才会被实例化,比较节省内存,但是这种情况在单线程模式下是安全的,多线程下则有可能会创建多个对象。
多线程模式
? 输出结果:
所以在单模式下,可能会创建多个对象,这就违背了单例模式的原则,那怎样得到一个线程安全的的懒汉式呢/p>
DCL懒汉式
但是这种情况下也是有可能不安全的的,因为在if语句里new的时候,表面上只有一部操作,实际上底层进行的三部操作
? 1.开辟内存空间
? 2.调用构造器,进行初始化
? 3.把地址返回给对象
? 按道理讲会123一步一步的执行,但是有可能会指令重排按照132这个顺序执行。
? 第一个线程进来之后,执行了13,这时候第二线线程进来了就会以为对象已经被创建,就会执行return,但是第一个线程还没有进行第二步操作。
所以需要加上一个volatile(避免指令重排)
volatile
但是可以通过反射破解,枚举当我没说昂(这里就不讲反射怎么破解了,知道就行)。
三:内部类版本
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!