zoukankan      html  css  js  c++  java
  • 单例设计模式--懒汉模式

    /**
    * 懒汉模式
    * 延迟加载,只有在真正使用的时候,才开始实例化。
    * 线程安全
    * 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;
    }
    }
  • 相关阅读:
    不要再浪费时间阅读文献技巧本
    Reporting Services 中的分页方式Report Builder 3.0
    国外实时数据库比较
    转VS2010 C++下编译调试MongoDB源码 代震军
    C#中异步和多线程的区别
    Python seems amazing!
    嵌入式(armcc)自动调用函数
    MSSQL2008 日志文件收缩
    萝卜地...分享;
    Apache配置多个站点;
  • 原文地址:https://www.cnblogs.com/FivePointOne/p/13848864.html
Copyright © 2011-2022 走看看