当前位置: 首页 > article >正文

单例模式详解【2023年最新】

一、单例模式概念

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。它的目的是限制一个类只能创建一个对象,以确保在整个应用程序中只有一个共享的实例。

单例模式通常用于以下情况:

  1. 当一个类只需要一个实例来协调操作时,例如数据库连接池、线程池等。
  2. 当希望在整个应用程序中共享某个资源或状态时,例如配置信息、日志记录器等。
  3. 当创建一个对象的成本很高,但又需要频繁地使用该对象时,可以通过单例模式来避免重复创建对象,提高性能。

单例模式的关键特点包括:

  1. 私有的构造方法:通过将构造方法私有化,防止外部代码直接实例化该类。
  2. 静态变量持有实例:通过一个静态变量来持有类的唯一实例。
  3. 全局访问点:提供一个公共的静态方法来获取该实例,以便其他代码可以访问该实例。

常见的单例模式实现方式包括饿汉式、懒汉式、双重检查锁定等。每种实现方式都有其优缺点,选择适合具体需求的实现方式非常重要

二、单例模式类型

1、懒汉式

这里使用了volatile,防止指令重排序。

另外,使用synchronized修饰代码,加锁变成线程安全。

public class SingleTon {
//    懒汉式
    private static volatile SingleTon singleTon;
    private SingleTon(){
    }
    public static SingleTon getInstance(){
        if(singleTon==null){
            synchronized (SingleTon.class){
                if(singleTon==null){
                    return new SingleTon();
                }
            }
        }
        return singleTon;
    }
}

2、饿汉式

这里的饿汉式没什么好说的。

public class SingleTon1 {
//    饿汉式
    private static final SingleTon1 singleTon1 = new SingleTon1();
    private SingleTon1(){

    }
    public static SingleTon1 getInstance(){
        return singleTon1;
    }
}

3、枚举(饿汉式升级版)

前面两种懒汉式和饿汉式都可以被反射或者序列化破坏,他们俩可以把单例对象破坏掉(即产生多个对象)而使用枚举就可以避免这种情况,而且使用枚举在代码简洁的情况下,还不用做任何操作即可保证创建对象1的单一性和线程的安全性。

public enum EnumSingleTon {
    INSTANCE;
    EnumSingleTon(){
        System.out.println("枚举创建对象了");
    }
    public void doSomeThing(){
        System.out.println("这是枚举的单例模式");
    }
    public static void main(String[] args) {
        test();
    }
    public static void test(){
        EnumSingleTon enumSingleTon1 = EnumSingleTon.INSTANCE;
        EnumSingleTon enumSingleTon2 = EnumSingleTon.INSTANCE;
        System.out.print("enumSingleTon1和enumSingleTon2的地址是否相同:");
        System.out.println(enumSingleTon1==enumSingleTon2);
    }
}

运行结果

学生所做,仅记录学习。


http://www.kler.cn/a/104252.html

相关文章:

  • 可自由搭建的能源管理平台,轻松实现高效节能
  • AI是未来?——神经网络篇
  • css 雷达扫描图
  • pnp单目相机标定测距
  • Windows Server 2019 搭建FTP站点
  • sheng的学习笔记-【中】【吴恩达课后测验】Course 3 - 结构化机器学习项目 - 第二周测验
  • 基于Java的智能仓库(进销存)管理系统设计与实现(源码+lw+部署文档+讲解等)
  • Python爬虫网易云音乐,Tkinter制作音乐播放器
  • 基于Java的智能停车场管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 在 openresty 中使用 capnp lua 库
  • 禾匠旧版对接微信小程序发货系统(发货信息管理 接口)
  • WAS项目更新单个文件
  • 【方法】如何给PDF文件添加“打开密码”?
  • Android Glide判断图像资源是否缓存onlyRetrieveFromCache,使用缓存数据,Kotlin
  • C#(JS)几个常用的正则表达式
  • MAXScript - tyFlow for 3dsMax
  • 2.9.C++项目:网络版五子棋对战之业务处理模块的设计
  • 18 Transformer 的动态流程
  • 使用form-data传递数组和x-www-form-urlencoded传递的区别
  • UE4/5 批量进行贴图Texture压缩、修改饱和度