设计模式-创建型-单例模式

1.概念

该设计模式保证全局只有一个实例对象可以使用,并且自动实例化,向外部提供一个使用接口。

2.作用

保证某些对象在项目中只有一份。

3.应用场景

比如:

全局的计数器------web页面文章阅读计数

全局的资源共享------用户登录后各个页面之间共享用户信息

线程池、数据库连接池------线程和连接可以多个,池应该只有一个

4.特点

单例对象全局只有一份

5.类与对象关系

使用static修饰该单例对象,保证全局可访问

6.实现

单例模式有多种实现方式,根据其创建时机的不同,可以分为饿汉式与懒汉式

6.1饿汉式

饿汉式会在类加载时就完成对象的创建

java 复制代码
public class EagerSingleton {

  private static final EagerSingleton instance = new EagerSingleton();

  private EagerSingleton() {
    // 私有化构造函数
  }

  public static EagerSingleton getInstance() {
    return instance;
  }
}

6.2懒汉式

在真正要获取对象时才会创建对象,因为是调用方法时才创建对象,所以存在线程安全问题。

java 复制代码
public class LazySingleton {

  private static LazySingleton instance;

  private LazySingleton() {
    // 私有化构造函数
  }

  public static LazySingleton getInstance() {
    if (instance == null) {
      instance = new LazySingleton();
    }
    return instance;
  }
}

6.3双重检查锁

为了保证懒汉式的线程安全,我们可以在方法上添加同步锁.

java 复制代码
public class DoubleCheckedLockingSingleton {  
    private static volatile DoubleCheckedLockingSingleton instance;  
  
    private DoubleCheckedLockingSingleton() {  
        // 私有化构造函数  
    }  
  
    public synchronized static DoubleCheckedLockingSingleton getInstance() {  
        if (instance == null) {  
             instance = new DoubleCheckedLockingSingleton();  
            }  
        }  
        return instance;  
    }  
}

为了进一步缩小锁的粒度,提升效率,我们可以修改成以下形式,也叫双重检查锁。

java 复制代码
public class DoubleCheckedLockingSingleton {  
    private static volatile DoubleCheckedLockingSingleton instance;  
  
    private DoubleCheckedLockingSingleton() {  
        // 私有化构造函数  
    }  
  
    public static DoubleCheckedLockingSingleton getInstance() {  
        if (instance == null) {  
            synchronized (DoubleCheckedLockingSingleton.class) {  
                if (instance == null) {  
                    instance = new DoubleCheckedLockingSingleton();  
                }  
            }  
        }  
        return instance;  
    }  
}
相关推荐
卓怡学长5 分钟前
w192基于springboot“考研情报站”微信小程序设计与实现
java·spring boot·spring·微信小程序·intellij-idea
wuminyu16 分钟前
JEP491中synchronized关键字引发的平台线程钉住解决方法简介
java·linux·c语言·jvm·c++
anew___1 小时前
《从零手写操作系统 (20):ELF加载器——让OS读懂现代编译器》
java·服务器·前端
code2cat1 小时前
【随笔】MCP资源更新订阅:通知到达以后,Agent怎样刷新旧资料
java·后端·开发工具·ai agent·mcp
一只旭宝2 小时前
C++ 后端开发面试题整理
java·c++·面试
sunshine22 girl2 小时前
Java学习五 面向对象高级5 内部类3-静态内部类和局部内部类(了解)
java·学习
en.en..2 小时前
Linux 进程退出exit(函数)
java·开发语言·算法
李游Leo2 小时前
HarmonyOS 7 TaskPool + Node-API + zstd:Native 批量压缩任务的主线程隔离、进度回传与资源收口【鸿蒙心迹】
java·华为·harmonyos
Light Gao2 小时前
Encoder 与 Decoder 详解:从 Embedding 到 Seq2Seq 的完整数据流
java·开发语言·embedding
程序猿乐锅3 小时前
【黑马点评 | 第十一篇】关注 Feed 流实现
java·数据库·redis·分布式·后端·缓存·maven