单例模式有几种写法
Posted colleage新资讯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式有几种写法相关的知识,希望对你有一定的参考价值。
本例的亮点都在getInstance()方法上,可以看到在该方法中对instance进行了两次判空:第一层判断为了避免不必要的同步,第二层判断则是为了在null的情况下创建实例。对第六种单例的漏洞进行了弥补,但是还是有丶小问题的,问题就在instance = new Singleton();语句上。
这语句在这里看起来是一句代码啊,但实际上它并不是一个原子操作,这句代码最终会被编译成多条汇编指令,它大致做了3件事情:
给Singleton的实例分配内存
调用Singleton()的 构造函数,初始化成员字段
将instance对象指向分配的内存空间(此时instance就不是null了)
但是,由于Java编译器运行处理器乱序执行,以及jdk1.5之前Java内存模型中Cache、寄存器到主内存会写顺序的规定,上面的第二和第三的顺序是无法保证的。也就是说,执行顺序可能是1-2-3也可能是1-3-2.如果是后者,并且在3执行完毕、2未执行之前,被切换到线程B上,这时候instance因为已经在线程A内执行3了,instance已经是非null,所有线程B直接取走instance,再使用时就会出错,这就是DCL失效问题,而且这种难以跟踪难以重现的问题很可能会隐藏很久。
优点:线程安全;延迟加载;效率较高。
缺点:JVM编译器的指令重排导致单例出现漏洞。
以上是关于单例模式有几种写法的主要内容,如果未能解决你的问题,请参考以下文章