单例模式

Posted madyanyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

Ⅰ.饿汉式天生线程安全

Ⅱ.以下是懒汉式单例模式以及思考

public class DoubleCheckedLocking {

    private static volatile DoubleCheckedLocking instance;

    private DoubleCheckedLocking() {
    }

    public static DoubleCheckedLocking getInstance() {

        //已经存在对象,避免不必要的同步
        if (null != instance) {
            return instance;
        }
        synchronized (DoubleCheckedLocking.class) {
            if (null == instance) {
           //3.这里有可能发生指令重排
                instance = new DoubleCheckedLocking();
                //new一个对象 1.开辟空间 2.初始化对象信息 3.返回对象的地址给引用
                //假设new这个对象很耗时(可能存在大量成员变量),可能存在先执行3,再执行2
                //A线程在初始化对象,3步骤先于2执行,先返回引用,假设此时B线程执行if判断,则返回instance,但这里instance并没有完成初始化,在使用中可能会产生NPE异常
            }
        }
        return instance;
    }
}

 

/**
 * 线程安全,懒加载,无锁效率高
 */
public class SingletonObject2 {

    private SingletonObject2() {

    }

    /**
     * static可以保证在jvm中唯一性
     * 需要时才会加载
     * 当线程调用getInstance() class InstanceHolder 会主动加载,并初始化构建instance对象
     * java内存模型保证类初始化是线程安全的
     */
    private static class InstanceHolder {
        private static final SingletonObject2 instance = new SingletonObject2();
    }

    private static SingletonObject2 getInstance() {
        return InstanceHolder.instance;
    }
}

 

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块