• 一些单例模式


    1.双重检查

    package com.qd.singleton;
    
    /**
     * Created by chenlongbo on 2017/4/24.
     */
    // Version 4 双重检查版
    public class Single4 {
    
        private static volatile Single4 instance;
    
        private Single4() {
        }
    
        public static Single4 getInstance() {
            if (instance == null) {
                synchronized (Single4.class) {
                    //主要在于singleton = new Singleton()这句,这并非是一个原子操作,事实上在 JVM 中这句话大概做了下面 3 件事情。
                    //1. 给 singleton 分配内存
                    // 2. 调用 Singleton 的构造函数来初始化成员变量,形成实例
                    // 3. 将singleton对象指向分配的内存空间(执行完这步 singleton才是非 null 了)
                    // 但是在 JVM 的即时编译器中存在指令重排序的优化。
                    // 也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是 1-2-3
                    // 也可能是 1-3-2。如果是后者,则在 3 执行完毕、2 未执行之前,被线程二抢占了,这时 instance 已经是非 null 了(但却没有初始化),
                    // 所以线程二会直接返回 instance,然后使用,然后顺理成章地报错。所以要再次进行判断
                    if (instance == null) {
                        instance = new Single4();
                    }
                }
            }
            return instance;
        }
    }

    2.枚举

    package com.qd.singleton;
    
    /**
     * Created by chenlongbo on 2017/4/24.
     */
    // Effective Java 第二版推荐写法
    public enum EffectiveSingleEnum {
        INSTANCE;
        public void fun1() {
            // do something
        }
    }
    
    // 使用
    //EffectiveSingleEnum.INSTANCE.fun1();

    3.内部类

    package com.qd.singleton;
    
    /**
     * Created by chenlongbo on 2017/4/24.
        Effective Java 第一版推荐写法
        第一版推荐写法对于内部类SingletonHolder,它是一个饿汉式的单例实现,
        在SingletonHolder初始化的时候会由ClassLoader来保证同步使INSTANCE是一个真·单例。
        同时,由于SingletonHolder是一个内部类,只在外部类的Singleton的getInstance()中被使用,
        所以它被加载的时机也就是在getInstance()方法第一次被调用的时候。
        ——它利用了ClassLoader来保证了同步,同时又能让开发者控制类加载的时机。
     */
    
    public class EffectiveSingle1 {
        private static class SingletonHolder {
            private static final EffectiveSingle1 INSTANCE = new EffectiveSingle1();
        }
    
        private EffectiveSingle1() {
        }
    
        public static final EffectiveSingle1 getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }

    4.饿汉式

    package com.qd.singleton;
    
    /**
     * Created by chenlongbo on 2017/4/24.
     */
    //饿汉式实现
    public class SingleB {
        private static final SingleB INSTANCE = new SingleB();
        private SingleB() {}
        public static SingleB getInstance() {
            return INSTANCE;
        }
    }
  • 相关阅读:
    StructureMap经典的IoC/DI容器
    移植的7zip到Vxworks 取名vx7zip
    试验Boost在Vxworks上的应用日记 三
    Log4cpp 崩溃
    试验Boost在Vxworks上的应用日记 一
    Vx7zip改进
    GoAhead 2.5 Web Server 网页ROM化的改进
    试验Boost在Vxworks上的应用日记 二
    原来CoreBluetooth 只支持Bluetooth Low Energy
    可变长结构体
  • 原文地址:https://www.cnblogs.com/cbySense/p/6909793.html
Copyright © 2020-2023  润新知