8-DCL double-check locks(指令重排序导致的非线程安全问题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84619976
  1. DCL double-check locks(指令重排序导致的非线程安全问题)
    1. 单例模式1: 非线程安全模式

问题:多线程环境下,可能多个线程singleton == null,导致new多个实例对象

    1. 单例模式2:synchronized修改方法块

问题:并发比较高的情况下,速率很慢

    1. 单例模式3:DCL模式:检查-加锁-检查

instance = new Singleton() 分为:1-分配内存空间,2-初始化对象,3-设置instance指向内存地址;

指令重排序:

单线程环境下,由于2-3没有数据依赖关系,故可能存在1-2-3 以及 1-3-2两种情况;

假定,某个线程按照1-3-2执行完成第3步,而另外一个线程,进行DCL的外层检查,发现没有问题,可能会返回一个未完全实例化的对象

    1. 最终版:单例模式4:volatile变量禁止指令重排序,让DCL生效

    1. 常用的单例模式:类初始化时完成实例化

多线程学习大纲:https://mp.csdn.net/postedit/84768644

猜你喜欢

转载自blog.csdn.net/qq_38331606/article/details/84619976