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

news2024/11/14 22:30:07

一、单例模式概念

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

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

  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.coloradmin.cn/o/1133926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务容错框架Sentinel入门

概述 Sentinel,阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。分布式系统的流量防卫兵。 特征: 丰富的应用场景:秒杀(即突发流量控制在系统…

物联网AI MicroPython传感器学习 之 GP2Y10粉尘传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 GP2Y10粉尘传感器用于检测非常细的空气漂浮颗粒物,主要用于空气净化系统中,传感器外观引脚如下图所示。 引脚定义 GND:地VCC:5VLED&#xff1a…

Dos和DDos攻击

Dos Denialof Service拒绝服务,利用程序漏洞或一对一资源耗尽的,攻击有计算机网络宽带攻击和连通性攻击 分类: D网络:耗尽目标网络带宽资源 如:ICMP Flood, UDP Flood D协议:攻击协议漏洞发起的拒绝服务攻击 如…

Leetcode—17.电话号码的字母组合【中等】

2023每日刷题&#xff08;九&#xff09; Leetcode—17.电话号码的字母组合 回溯法解题 实现代码 class Solution { public:vector<string> table {"","","abc","def","ghi","jkl","mno",&quo…

leetCode 283 移动零

//right指向待处理序列的首部 //left指向处理后序列的尾部class Solution {public void swap(int[] nums, int left, int right){int tmp nums[left];nums[left] nums[right];nums[right] tmp;}public void moveZeroes(int[] nums) {int n nums.length;int left 0;int rig…

Oracle(6) Control File

一、oracle控制文件介绍 1、ORACLE控制文件概念 Oracle控制文件是Oracle数据库的一个重要元素&#xff0c;用于记录数据库的结构信息和元数据。控制文件包含了数据库的物理结构信息、数据字典信息、表空间和数据文件的信息等。在Oracle数据库启动时&#xff0c;控制文件会被读…

【c#】2022创建WEB API接口教程demo

c#创建WEB API接口 创建WEB API接口结果图涉及到的技术设计流程创建WEB API接口 结果图 涉及到的技术 设计流程 1、创建WEB api项目,使用控制器和penapi勾选上,第一次创建项目时没有勾选,因为感觉没啥用。后面跑项目的时候,要把接口用swagger去直接生成的时候,还是需要…

新的抓包神器,完全免费,支持多平台!

目前IOS端的抓包软件&#xff1a; HTTP Catcher&#xff08;网球&#xff09;&#xff0c;免费下载&#xff0c;完整版需要内购。 Storm Sniffer&#xff08;螃蟹&#xff09;&#xff0c;免费下载&#xff0c;完整版需要内购。 Thor&#xff08;锤子&#xff09;&#xff0…

安全设备

一.防火墙 5层应用层 防火墙 4层 udp tcp 协议 华为 厂商 华为 h3 1.区域划分 Dmz 停火区 Untrust 不安全区域 Trust 安全区域 防火墙 默认禁止所有 二.Waf Web 应用防火墙 放到web前面 产品 雷池 绿盟 软件 安…

proxy解决跨域问题

在使用vite工具创建的项目中解决跨域问题&#xff1a; 在vue.config.js中配置如下代码&#xff1a; const { defineConfig } require(‘vue/cli-service’) module.exports defineConfig({ transpileDependencies: true, server:{ proxy:{ ‘/path’:{ target:‘https://i.…

21 行为型模式-职责链模式

1 职责链模式介绍 2 职责链模式原理 3 职责链模式实现 责任链模式的实现非常简单&#xff0c;每一个具体的处理类都会保存在它之后的下一个处理类。当处理完成后&#xff0c;就会调用设置好的下一个处理类&#xff0c;直到最后一个处理类不再设置下一个处理类&#xff0c;这时…

美团悄悄上线社群团购“团买买”

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 之前有社交电商&#xff1a;群买买、快团团、群团团、京喜团&#xff0c;而最近美团也上线了一款社群团购工具“团买买”的小程序。看来今年社群团购赛道非常热门啊&#xff0c;美团的“团买买”对…

【JAVA学习笔记】44 - 注解,元注解

项目代码 一、注解的引入 1)注解(Annotation)也被称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。 2)和注释一样&#xff0c;注解不影响程序逻辑&#xff0c;但注解可以被编译或运行&#xff0c;相当于嵌入在代码中的补充信息。 3)在Ja…

回归预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期神经网络多输入单输出回归预测

回归预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期神经网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiLSTM贝叶斯优化双向长…

让MyEclispe中英文切换详解(附源码)

找到根目录 打开图中红框圈起来的myeclipse.ini文件&#xff08;或者选择使用记事本打开&#xff09; 在末尾添加 -Duser.languageen 这是设置成英文版 设置成中文则将 en 更改为 zh_cn就行了 -Duser.languageen-US -Duser.languagezh_cn

VMware 20.4 桥接网络配置

1、新建一个虚拟网卡&#xff0c;选择桥接模式 2、配置具体系统的网络适配器&#xff0c;选择自定义&#xff0c;选择刚才新建的网卡 3、开启虚拟机&#xff0c;进入命令行&#xff0c;修改以下文件&#xff0c;文件名可能不一样 vi /etc/netplan/01-network-manager-all.yaml…

深入浅出排序算法之希尔排序

目录 1. 原理 2. 代码实现 3. 性能分析 1. 原理 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有记录分成个组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xf…

Linux环境基础开发工具的使用

目录 一、Linux软件包管理器yum 1.1 Linux下载软件的方式 1.2 认识yum 1.3 查看软件包 1.4 安装软件 1.5 本地机器与云服务器文件互传 1.6 卸载软件 二、编辑器vim 2.1 vim下各模式的切换 2.2 命令模式下各命令汇总 2.3 底行模式各命令汇总 2.4 vim的简单配置 三…

二十一、设计模式之解释器模式

目录 二十一、设计模式之解释器模式能帮我们干什么&#xff1f;主要解决什么问题&#xff1f;优缺点优点缺点&#xff1a; 使用的场景角色和职责实现解释器 总结 二十一、设计模式之解释器模式 所属类型定义行为型允许你定义一个语言并解释该语言中的表达式 能帮我们干什么&am…

C++之lambda匿名函数总结(二百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…