zoukankan      html  css  js  c++  java
  • 一些单例模式

    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;
        }
    }
  • 相关阅读:
    hdu 5269 ZYB loves Xor I && BestCoder Round #44
    Hibernate之关于多对多单向关联映射
    測试CPU支持指令集AVX,AVX2,SSE情况的代码【VS2010调试通过】
    联想教育应用使用说明(7.6版本号)——第5章 常见的问题与解答
    java.lang.ClassNotFoundException: org.springframework.web.content.ContextLoaderListener
    IETF和W3C的区别
    [ppurl]从”皮皮书屋”下载电子书的姿势
    javaEE面试重点
    HDU-1095-A+B for Input-Output Practice (VII)(多一个空格?)
    WinCC7.3 Win764位系统安装教程
  • 原文地址:https://www.cnblogs.com/cbySense/p/6909793.html
Copyright © 2011-2022 走看看