单例模式
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; } }
以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章