1.单例模式的简单理解
单例模式:即一个类在程序运行过程中只被实例化一次,也就是说该类在程序的生命周期中只有一个实例对象。
使用单例模式的优点:由于该类只实例化一次,因此无论有多少个类使用该类,该类都只有一个对象。 所以,
减少类实例对象的创建 --> 减少GC压力 --> 提高程序性能。
2、单例模式的几种常见写法
/**
* 饿了么中国式(线程安全)。当一个类被加载时,会创建一个唯一的单例实例,无论后面是否使用它。
* 以空间换时间的思想,
*/
班级 {
=新的();
(){}
(){
;
/**
* 饿了么变体模式,使用静态代码块。包括上面的饿了么中文写法,也是线程安全的。
* 因为这两个方法实际上是间接使用了关键字,那么它们是如何使用的呢?
* 这是了解类加载的机制和过程所必需的
*/
班级 {
= 空;
{
=新的();
(){}
(){
这。;
/**
* 惰性风格(不是线程安全的,可以在创建函数之前添加关键字变得线程安全)
* 单例实例仅在使用时创建
*/
班级 {
;
(){
(){ // 在方法变得线程安全之前添加关键字,但会增加创建的时间消耗。
如果(==空){
=新的();
;
/**
* 惰性方式(线程安全双重检查锁版本)
*/
班级 {
;
(){}
() {
if (==null){ //首先检查
(。班级){
if (==null){ //第二次检查
=新的();
;
/**
* 枚举实现线程安全的单例模式
* 底层是依靠Enum类实现的,枚举类的成员变量实际上都是静态类型,并且是
* 在静态代码块中实例化,有点像饿汉模式,而且天然也是线程安全的
*/
枚举{
;
空白 {
/**
* 使用单例实现线程安全
* 也是一种以空间换时间的方法(因为会为每个线程提供独立的副本)
* 就是多个线程相互独立地访问数据
*/
班级 {
F