设计模式之单例模式

Posted dushenzi

tags:

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

设计模式是前辈们对代码日积月累的总结,形成的一种良好的编程思想和技巧。

       单例模式,使用非常广泛,本篇将介绍三种常用的单例模式的实践:类加载时初始化类对象(也叫饿汉模式)、延迟加载初次调用时初始化类对象(也叫饱汉模式)、双重检查机制。

       一、类加载时初始化类对象(也叫饿汉模式):首先构造函数要使用private修改,外部类无法通过new创建类对象;其次定义一个private static类型的类对象并实例化;最后通过public static修改的方法获取类加载时创建的类对象。如果说这个类一次都没使用过,那么初始化操作就是无畏的多余操作。

技术分享图片

       二、延迟加载初次调用时初始化类对象(也叫饱汉模式):首先构造函数要使用private修改,外部类无法通过new创建类对象;其次定义一个private static类型的类对象,并不初始化;最后通过public static synchronized修改的方法获取类实例,方法体内,如果类对象为null就创建一个,最终返回。由于使用了synchronized同步关键字,因此同一时刻只有一个线程能获取类实例,性能稍微有影响。

技术分享图片

       三、双重检查机制:首先构造函数要使用private修改,外部类无法通过new创建类对象;其次定义一个private static volatile类型的类对象,并不初始化;最后通过public static修改的方法获取类实例,方法体内,会有两次类实例的检查,在第一次检查的内部,使用synchronized同步关键字加锁,这样就保证了最终实例化的时候,只有一个线程创建了对象。由于类对象是用volatile修饰的,因此类对象创建之后会立马更新到主内存,并清空各个线程该对象的副本,强制各个线程重新从主内存获取新的值。从而保证了类对象最终只初始化了一次,而且是延迟加载。推荐使用这种方式创建单例。

技术分享图片

       提示:推荐使用双重检查机制,创建单例。

       volatile关键字的作用:对volatile修饰的变量的修改,会立马更新到主内存;将其他线程volatile修饰的变量的副本清空,强制各个线程重新从主内存中获取新的值。

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

设计模式之单例模式

JAVA设计模式之单例模式(转)

单例模式之单例模式

JAVA设计模式之单例模式

《JAVA与模式》之单例模式

《JAVA与模式》之单例模式