八种单例模式详解

亲爱的朋友们,大家好!

今天是 CSDN博客之星 投票的开始日!非常感谢你们在过去的时间里给予我无私的支持和鼓励,这一路走来,正是因为有你们的帮助,我才能不断进步,走得更远。

目前,投票已正式开启(2月14日到2月20日,一共七天,每天都可以投),如果你们愿意支持我,可以通过以下链接给67号进行投票:

点击这里投票

CleanShot 2025-02-14 at 23.01.42@2x

我非常珍惜你们的每一份支持,这对我意义重大,也将是我不断前进的动力!如果你们能为我投上宝贵的一票,我会更加努力,继续为大家带来更多有价值的技术分享。另外,这是我半年时间自研的 Java 框架 Sunrays-Framework

Sunrays-Framework官方文档

如果有兴趣,欢迎随时取用!

再次感谢大家的支持与鼓励,期待我们一起成长!


文章目录

    • 1.单例模式饿汉式(静态变量)
    • 2.单例模式饿汉式(静态代码块)
    • 3.单例模式懒汉式(线程不安全)
    • 4.单例模式懒汉式(同步方法)
    • 5.单例模式饿汉式(同步代码块,线程不安全)
    • 6.单例模式懒汉式(双检锁)
    • 7.单例模式懒汉式(静态内部类)
    • 8.单例模式饿汉式(枚举实现)
    • 9.总结

1.单例模式饿汉式(静态变量)

package com.sunxiansheng.design_pattern.singleton;/*** Description: 单例模式饿汉式(静态变量)** @Author sun* @Create 2025/1/17 15:12* @Version 1.0*/
public class TypeA {public static void main(String[] args) {Singleton singletonA = Singleton.getInstance();Singleton singletonB = Singleton.getInstance();System.out.println(singletonA == singletonB);}
}class Singleton {/*** 构造器私有化*/private Singleton() {}/*** 静态变量*/private static final Singleton INSTANCE = new Singleton();/*** 暴露单例对象** @return*/public static Singleton getInstance() {return INSTANCE;}
}

2.单例模式饿汉式(静态代码块)

package com.sunxiansheng.design_pattern.singleton.TypeB;/*** Description: 单例模式饿汉式(静态代码块)** @Author sun* @Create 2025/1/17 15:15* @Version 1.0*/
public class TypeB {public static void main(String[] args) {Singleton singletonA = Singleton.getInstance();Singleton singletonB = Singleton.getInstance();System.out.println(singletonB == singletonB);}
}class Singleton {/*** 构造器私有化*/private Singleton() {}/*** 静态单例对象声明*/private static Singleton INSTANCE;/*** 静态代码块初始化单例对象*/static {INSTANCE = new Singleton();}/*** 向外暴露单例对象** @return*/public static Singleton getInstance() {return INSTANCE;}
}

3.单例模式懒汉式(线程不安全)

package com.sunxiansheng.design_pattern.singleton.TypeC;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;/*** Description: 单例模式懒汉式(线程不安全)** @Author sun* @Create 2025/1/17 15:22* @Version 1.0*/
public class TypeC {
}class Singleton {/*** 构造器私有化*/private Singleton() {}/*** 静态变量*/private static Singleton INSTANCE;/*** 对外暴露单例对象** @return*/public static Singleton getInstance() {// 只有当静态变量为空的时候才赋值if (INSTANCE == null) {INSTANCE = new Singleton();}return INSTANCE;}
}

4.单例模式懒汉式(同步方法)

package com.sunxiansheng.design_pattern.singleton.TypeD;/*** Description: 单例模式懒汉式(同步方法)** @Author sun* @Create 2025/1/17 15:36* @Version 1.0*/
public class TypeD {
}class Singleton {/*** 构造器私有化*/private Singleton() {}/*** 静态属性*/private static Singleton INSTANCE;/*** 同步方法,保证线程安全** @return*/public synchronized static Singleton getInstance() {if (INSTANCE == null) {INSTANCE = new Singleton();}return INSTANCE;}
}

5.单例模式饿汉式(同步代码块,线程不安全)

package com.sunxiansheng.design_pattern.singleton.TypeE;/*** Description: 单例模式饿汉式(同步代码块,线程不安全)** @Author sun* @Create 2025/1/22 15:15* @Version 1.0*/
public class TypeE {}class Singleton {/*** 构造器私有化*/private Singleton() {}/*** 静态变量*/private static Singleton singleton;/*** 向外暴露单例对象** @return*/public static Singleton getInstance() {if (singleton == null) {// 使用一个同步代码块来解决synchronized (Singleton.class) {singleton = new Singleton();}}return singleton;}
}

6.单例模式懒汉式(双检锁)

package com.sunxiansheng.design_pattern.singleton.TypeF;/*** Description: 单例模式懒汉式(双检锁)** @Author sun* @Create 2025/1/22 15:25* @Version 1.0*/
public class TypeF {
}class Singleton {/*** 构造器私有化*/private Singleton() {}/*** 静态变量,volatile保证可见性*/private static volatile Singleton instance;/*** 向外暴露单例对象** @return*/public static Singleton getInstance() {// 1.判空if (instance == null) {// 2.加锁synchronized (Singleton.class) {// 3.再判空if (instance == null) {instance = new Singleton();}}}return instance;}
}

7.单例模式懒汉式(静态内部类)

package com.sunxiansheng.design_pattern.singleton.TypeG;/*** Description: 单例模式懒汉式(静态内部类)** @Author sun* @Create 2025/1/22 15:35* @Version 1.0*/
public class TypeG {
}class Singleton {/*** 构造器私有化*/private Singleton() {}/*** 静态内部类,里面有一个静态常量*/private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}/*** 暴露方法,加载静态内部类,并获取对象** @return*/public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

8.单例模式饿汉式(枚举实现)

package com.sunxiansheng.design_pattern.singleton.TypeH;/*** Description: 单例模式饿汉式(枚举实现)** @Author sun* @Create 2025/1/22 15:42* @Version 1.0*/
public class TypeH {
}enum Singleton {/*** 天生的单例对象*/SINGLETON(1, "sun");private int age;private String name;/*** 构造器默认是私有化的** @param age* @param name*/Singleton(int age, String name) {this.age = age;this.name = name;}
}

9.总结

单例模式共有八种,其中包含几种典型错误!

第一种是通过静态变量来实现,也就是利用了类只加载一次的特性去完成的。

第二种是通过静态代码块来实现对静态变量的赋值,本质跟第一种没有区别。

第三种是想要实现一个懒汉式,就直接判断变量不为空的时候再赋值,但是会有线程安全问题。

第四种是为了保证线程安全,就采用了同步方法,这样虽然可以解决问题,但是锁的粒度太大。

第五种是为了降低锁的粒度,想要使用同步代码块加在创建实例的部分,但是是没用的,因为可以有多个线程同时判断变量为空,从而进来创建对象,这样做只能保证按照顺序的创建对象,并不能保证不会多次创建对象。

第六种就是既可以降低锁的粒度又可以保证线程安全的双检锁,采用判空,加锁,再判空的方式来完成单例对象的创建。

第七种是静态内部类的方式,就是编写一个静态内部类,持有着静态常量,类加载并不会加载静态内部类,所以外部类在需要的时候去拿这个单例对象即可。

第八种是枚举实现,枚举可以说是最佳的单例实现方式,只要只创建一个枚举对象,那么就是单例的了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20454.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 PWM脉冲宽度调制介绍

目录 背景 PWM 模式 影子寄存器和预装载寄存器 PWM对齐模式 PWM 边沿对齐模式 向上计数配置 向下计数的配置 PWM 中央对齐模式 程序 第一步、使能GPIOB组、AFIO、TIM3外设时钟 第二步、输出通道端口配置​编辑 第三步、定时器配置产生频率 第四步、PWM输出配置 第…

Java面试第二山!《计算机网络》!

在 Java 面试里,计算机网络知识是高频考点,今天就来盘点那些最容易被问到的计算机网络面试题,帮你轻松应对面试,也方便和朋友们一起探讨学习。 一、HTTP 和 HTTPS 的区别 1. 面试题呈现 HTTP 和 HTTPS 有什么区别?在…

deepseek-v3在阿里云和腾讯云的使用中的差异

随着deepseek在各大云商上线,试用了下阿里云和腾讯云的deepseek服务,在回答经典数学问题9.9和9.11谁大时,发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…

蓝桥杯单片机基础部分——单片机介绍部分

前言 这个部分是额外的,我看我有的学弟学妹基础比较差,对板子上面的模块不太熟悉,这里简单的介绍一下 蓝桥杯单片机 这个就是蓝桥杯单片机的板子,它的主控芯片是(IAP15F2K61S2),这里就对他常用…

百度搜索和文心智能体接入DeepSeek满血版——AI搜索的新纪元

在当今数字化时代,搜索引擎作为互联网信息获取的核心工具,正经历着前所未有的变革。据悉,2025年2月16日,百度搜索和文心智能体平台宣布全面接入DeepSeek和文心大模型的最新深度搜索功能,搜索用户可免费使用DeepSeek和文…

redis解决高并发看门狗策略

当一个业务执行时间超过自己设定的锁释放时间,那么会导致有其他线程进入,从而抢到同一个票,所有需要使用看门狗策略,其实就是开一个守护线程,让守护线程去监控key,如果到时间了还未结束,就会将这个key重新s…

【koa】05-koa+mysql实现数据库集成:连接和增删改查

前言 前面我们已经介绍了第二阶段的第1-4点内容,本篇介绍第5点内容:数据库集成(koamysql) 也是第二阶段内容的完结。 一、学习目标 在koa项目中正常连接数据库,对数据表进行增删改查的操作。 二、操作步骤 本篇文章…

aws(学习笔记第二十八课) aws eks使用练习(hands on)

aws(学习笔记第二十八课) 使用aws eks 学习内容: 什么是aws eksaws eks的hands onaws eks的创建applicationeks和kubernetes简介 1. 使用aws eks 什么是aws eks aws eks的概念 aws eks是kubernetes在aws上包装出来 的新的方式,旨在更加方便结合aws&…

IM聊天系统架构实现

一、IM系统整体架构 二、企业级IM系统如何实现心跳与断线重连机制; 1、重连机制(服务端下线) 服务端下线,客户端netty可以感知到,在感知的方法中进行重连的操作,注意重连可能连接到旧的服务器继续报错&…

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)

KubeadmContainerd部署k8s(v1.28.2)集群(非高可用版) KubeadmContainerd部署k8s高可用版本 文章目录 KubeadmContainerd部署k8s(v1.28.2)集群(非高可用版)一.环境准备1.服务器准备2.环境配置3.设置主机名4.修改国内镜像源地址5.配…

HarmonyOS进程通信及原理

大家好,我是学徒小z,最近在研究鸿蒙中一些偏底层原理的内容,今天分析进程通信给大家,请用餐😊 文章目录 进程间通信1. 通过公共事件(ohos.commonEventManager)公共事件的底层原理 2. IPC Kit能…

移动通信发展史

概念解释 第一代网络通信 1G 第二代网络通信 2G 第三代网络通信 3G 第四代网络通信 4G 4g网络有很高的速率和很低的延时——高到500M的上传和1G的下载 日常中的4G只是用到了4G技术 运营商 移动-从民企到国企 联通-南方教育口有人 电信 铁通:成立于 2000 年…

CAS单点登录(第7版)10.多因素身份验证

如有疑问,请看视频:CAS单点登录(第7版) 多因素身份验证 概述 多因素身份验证 (MFA) 多因素身份验证(Multifactor Authentication MFA)是一种安全机制,要求用户提供两种…

#渗透测试#批量漏洞挖掘#Fastjson 1.2.24 远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Fastjson 1.2.24 远程命令执行漏洞综合分析…

【设计模式】 代理模式(静态代理、动态代理{JDK动态代理、JDK动态代理与CGLIB动态代理的区别})

代理模式 代理模式是一种结构型设计模式,它提供了一种替代访问的方法,即通过代理对象来间接访问目标对象。代理模式可以在不改变原始类代码的情况下,增加额外的功能,如权限控制、日志记录等。 静态代理 静态代理是指创建的或特…

动态规划

简介 动态规划最核心两步: 状态表示:dp[i]代表什么状态转移方程:如何利用已有的dp求解dp[i] 只要这两步搞对了, 就完成了动态规划的%95 剩下的就是细节问题: dp初始化顺序(有时是倒序)处理边…

【论文笔记】On Generative Agents in Recommendation

论文信息 标题: On Generative Agents in Recommendation 会议: SIGIR 24 —— CCF-A 作者: An Zhang, Yuxin Chen, Leheng Sheng 文章链接: On Generative Agents in Recommendation 代码链接: On Generative Agents…

【动态路由】系统Web URL资源整合系列(后端技术实现)【nodejs实现】

需求说明 软件功能需求:反向代理功能(描述:apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 业务应用等多个web资…

【深度学习】如何一步步实现SGD随机梯度下降算法

如何一步步实现SGD随机梯度下降算法 文章目录 如何一步步实现SGD随机梯度下降算法SGD随机梯度下降算法的作用MNIST_SAMPLE数据集SGD算法的七大步骤Step1. 初始化模型参数Step2. 计算预测值predictionsStep3. 计算损失lossStep4. 计算梯度gradientsStep5. 更新模型参数Step6. 重…

Flutter 3.29.0 新特性 CupertinoNavigationBar 可配置bottom属性

Flutter 3.29版本优化了开发流程并提升了性能,对 Impeller、Cupertino、DevTools 等进行了更新。 CupertinoNavigationBar和CupertinoSliverNavigationBar现在接受底部小部件,通常是搜索字段或分段控件。 例如本小节内容就是放置了一个输入框&#xff…