• 单例设计模式--懒汉模式


    /**
    * 懒汉模式
    * 延迟加载,只有在真正使用的时候,才开始实例化。
    * 线程安全
    * double check 双重检查 加锁优化
    * 编译器(JIT),CPU有可能对指令进行重排序,导致使用到尚未初始化的实例,可以通过添加volatile关键字进行修饰,
    * 对于volatile修饰的字段,可以防止指令重排
    */
    public class LazySingleton {
    //volatile--防止重排序
    private volatile static LazySingleton instance;
    private LazySingleton(){

    }
    //在进行多线程操作时,会出现创建两个实例的情况,故加上(synchronized)锁保证只有一个实例存在
    public static LazySingleton getInstance(){//synchronized 考虑到性能损耗,如果加在方法上则表示不管实例有没有初始化,都会加上锁
    if(instance == null){
    //为空时,再进行加锁。此时又会出现新的问题,当多个线程都到达这个地方后,第一个顺利执行后,实例化过后,后面的所有线程都会又实例化一次
    //多个线程在此位置进行访问高并发还是会有一定的性能损耗
    synchronized (LazySingleton.class){
    //所以再加上一个条件
    if(instance == null){
    instance = new LazySingleton();
    //字节码层面
    //JIT CPU 可能对2.3.步骤进行重排序 造成空指针错误 如果解决? volatile--防止重排序
    //1.分配空间
    //2.初始化
    //3.引用赋值
    }
    }
    }
    return instance;
    }
    }
  • 相关阅读:
    sizeof和strlen的区别
    备注
    将一个正整数分解质因数
    malloc和new有什么区别
    用C来实现内存池
    句柄和指针的区别和联系是什么?
    c/c++ 宏中"#"和"##"的用法
    手机上网的原理
    数据类型转换(转自CSDN)
    vc debug和Release的切换
  • 原文地址:https://www.cnblogs.com/FivePointOne/p/13848864.html
Copyright © 2020-2023  润新知