ring2

  先来看看双重检测锁的实现以及一些简要的说明(本文主要说明双重检测锁带来的线程安全问题):

  

/**
 * 单例模式之双检锁
 * @author ring2
 * 懒汉式升级版
 */
public class Singleton3 {

    private static volatile Singleton3 instance;
    
    private Singleton3() {}
    
    public static Singleton3 getInstance() {
        
        //首先判断是否为空
        if(instance==null) {
            //可能多个线程同时进入到这一步进行阻塞等待
            synchronized(Singleton3.class) {
                //第一个线程拿到锁,判断不为空进入下一步
                if(instance==null) {
                    /**
                     * 由于编译器的优化、JVM的优化、操作系统处理器的优化,可能会导致指令重排(happen-before规则下的指令重排,执行结果不变,指令顺序优化排列)
                     * new Singleton3()这条语句大致会有这三个步骤:
                     * 1.在堆中开辟对象所需空间,分配内存地址
                     * 2.根据类加载的初始化顺序进行初始化
                     * 3.将内存地址返回给栈中的引用变量
                     * 
                     * 但是由于指令重排的出现,这三条指令执行顺序会被打乱,可能导致3的顺序和2调换
                     * 

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-06-09
  • 2022-12-23
  • 2022-12-23
  • 2022-01-20
  • 2022-12-23
  • 2021-06-10
  • 2021-12-02
猜你喜欢
  • 2022-12-23
  • 2022-03-12
  • 2022-12-23
  • 2022-12-23
  • 2021-08-25
  • 2021-04-19
相关资源
相似解决方案