zoukankan      html  css  js  c++  java
  • 多线程实例

    双重检查锁定来实现延迟初始化的方案:

    class Instance {
    
        
    }
    /*
     *     instance=new Singleton()
        memory = allocate();  // 1:分配对象的内存空间
        ctorInstance(memory);  // 2:初始化对象
        instance = memory;   // 3:设置instance指向刚分配的内存地址
     */
    public class SafeDoubleCheckedLocking {
        private volatile static Instance instance;//2,3之间不会重排序
        public static Instance getInstance() {
        if (instance == null) {
            synchronized (SafeDoubleCheckedLocking.class) {
            if (instance == null)
                instance = new Instance(); // instance为volatile,现在没问题了
            }
        }
        return instance;
        }
    }

    基于类初始化的解决方案:(

    JVM在类的初始化阶段(即在Class被加载后,且被线程使用之前),会执行类的初始化。在
    执行类的初始化期间,JVM会去获取一个锁。这个锁可以同步多个线程对同一个类的初始化。

    )

    class Instance{
        
    }
    public class InstanceFactory {
        private static class InstanceHolder {
            public static Instance instance = new Instance();
        }
        public static Instance getInstance() {
            return InstanceHolder.instance;  // 这里将导致InstanceHolder类被初始化
        }
    }
  • 相关阅读:
    【YbtOJ#20068】连通子图
    【YbtOJ#20067】糖果分配
    【GMOJ6801】模拟patrick
    【GMOJ6800】模拟spongebob
    【洛谷P4449】于神之怒加强版
    【洛谷P3601】签到题
    【洛谷P2408】不同子串个数
    【洛谷P3809】【模板】后缀排序
    【JZOJ1753】锻炼身体
    【GMOJ1164】求和
  • 原文地址:https://www.cnblogs.com/james-roger/p/5728325.html
Copyright © 2011-2022 走看看