以双重检查单身模式为例,首先应用代码:
如上所述,Singleton使用挥发性修改,我们都知道挥发性的作用
那么挥发性的究竟是什么作用?
实际上,在单数模式下,挥发性的作用主要是禁止说明
所以为什么?
在上面的代码中,singleton = new Singlet();可以分解为以下步骤:
但是步骤2,3可以交换,也就是说,但是根据java语言规范在线程内语义上,它允许在单个线程中允许这些语言中的这些内容,而无需更改单线程程序的结果的排序执行,这是指步骤2和3发生的,但是对于单个线程,在第一个访问对象时,结果是正确的,因此即使排序也无关紧要。
但是,在多线程环境中,会有问题,例如,以下多线程重型案例:
T1分配对象空间T2设置了指向分布式内存空间T3的单例,以确定Singleton是否为空T4。由于Singleton不是零,因此线程B将访问Singleton引用的对象。在重分类的情况下,这会导致线程B判断Singleton在T3中并非null,那么Thread B将使此Singleton可以做其他事情。然后,此时,该单身人士没有初始化,然后将是。如果您报告错误,则存在问题。
就正常过程而言,在T2时间线程A应该初始化Singleton,因此线程B在
可能会有一个小伙伴感觉像门,然后我会根据规范再次说出来:
根据代码,如果线程A在第12行中,则为Singleton = new Singleton();然后进行重排列,然后螺纹B是第9行中的第一个if(单例== null),然后让返回的singleton做其他事情并导致错误。
说到这一点,我相信您几乎了解到,如果您不知道,您可以看两次。
因此,为了解决此问题,挥发性用于修改单例,以禁止分类可能发生的问题。
作者:代码Pippi Shrimp
创建并不容易。如果这篇博客文章对您有帮助,我希望朋友可以连续三个点击三次,谢谢您的支持,我们下次见到您?