码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2019-10-19 11:21:07      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:变量   假设   sync   null   ret   调用   懒汉式单例模式   安全   需要   

Ⅰ.饿汉式天生线程安全

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

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;
    }
}

 

单例模式

标签:变量   假设   sync   null   ret   调用   懒汉式单例模式   安全   需要   

原文地址:https://www.cnblogs.com/MadYanYan/p/11703238.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!