• 多线程实例


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

    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类被初始化
        }
    }
  • 相关阅读:
    类的定义
    面向对象与面向过程介绍
    跨目录导入模块
    正则表达式re模块
    常用工具包(模块)
    生成器generator
    闭包
    命名空间name space
    函数的递归
    POJ1062
  • 原文地址:https://www.cnblogs.com/james-roger/p/5728325.html
Copyright © 2020-2023  润新知