单例模式实现

news2025/1/20 5:54:00

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:JavaEE
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

单例模式

  • 1. 什么是单例模式
  • 2. 饿汉模式
  • 3. 懒汉模式

1. 什么是单例模式

单例模式能保证某个类在程序中只存在唯⼀⼀份实例,⽽不会创建出多个实例。
单例模式最常⻅的实现方式是“饿汉”和“懒汉”两种。

  • 饿汉模式是在类加载的同时,创建实例。
  • 懒汉模式在类加载时不创建实例,只有第一次使用的时候才会创建实例。

就好比十只羊吃草,饿汉模式就是直接让十只羊全部开吃,而懒汉模式就是一个吃完下一个再吃。

2. 饿汉模式

class Singleton{
    private static Singleton instance=new Singleton();
    public static Singleton getInstance(){
        return instance;
    }
    private Singleton(){}
}
public class TestDemo6 {
    public static void main(String[] args) {
        Singleton s=Singleton.getInstance();
        Singleton s1=Singleton.getInstance();
        System.out.println(s==s1);//true
    }
}

该模式下的getInstance直接返回instance实例,该操作是一个“读操作”,对于多个线程读取同一个变量时,此模式下的操作是线程安全的。

3. 懒汉模式

class SingleLazy{
    private static SingleLazy instance=null;//不立即创建实例
    public static SingleLazy getInstance(){
        if(instance==null){
            instance=new SingleLazy();
        }
        return instance;
    }
    private SingleLazy(){}
}

该模式的实现是线程不安全的。
线程安全问题发⽣在⾸次创建实例时。如果在多个线程中同时调⽤ getInstance ⽅法,就可能导致创建出多个实例,就比如下面这种情况:
在这里插入图片描述
想要改善该问题,可以加上synchronized

class SingleLazy1{
    private static Object loker=new Object();
    private static SingleLazy1 instance=null;//volatile:解决重排序问题
    public static SingleLazy1 getInstance() {
            synchronized (loker) {
                if (instance == null) {
                    instance = new SingleLazy1();
                }
            }
        
        return instance;
    }
    private SingleLazy1(){}
}

在这里插入图片描述
此时,该代码已经没有线程安全问题了。

当instance已经创建过了,后面再调用getInstance就应该是直接返回instance实例,但是每次调用时仍会先加锁进入if中再解锁,就会很麻烦,降低了运行效率。而且加锁也就意味着可能会有阻塞,一旦线程进入阻塞状态,就不知道何时才能解除了。

所以在上述代码中可以加以改进,直接在加锁之前先进行一次判空

class SingleLazy1{
    private static Object loker=new Object();
    private static volatile SingleLazy1 instance=null;//volatile解决指令重排序问题
    public static SingleLazy1 getInstance() {
        if(instance==null) {
            synchronized (loker) {
                if (instance == null) {
                    instance = new SingleLazy1();
                }
            }
        }
        return instance;
    }
    private SingleLazy1(){}
}

在这里插入图片描述
如果按照132顺序就会产生下面的错误,所以为了避免该错误的发生,就使用volatile来禁止指令的重排序。
在这里插入图片描述

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

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

相关文章

JoySSL诚招SSL证书代理

不久前,阿里云宣布了一个让人稍感唏嘘的消息——它们的一年期免费SSL证书服务将停步,转而提供三个月期限的证书。这一变化,无疑会使得网站开发的公司在维持用户信任和网站安全上多出心思。然而,免费的午餐并没有彻底消失&#xff…

Epson打印机连接wifi

环境 Epson L3153 打印机联通无线光猫 背景 最近家里的联通宽带不太稳定,经常断网。今天打了联通客服电话,师傅上门来,说可能是光猫用的时间太长了,换了一个新的联通光猫,问题解决。 wifi的名称是 CU_Y3ft 和 CU_Y3…

使用Docker一键部署Uptime Kuma,并将监控服务映射至公网访问

文章目录 **主要功能**一、前期准备本教程环境为:Centos7,可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务,如何安装Docker详见: 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址访问…

web3风险投资公司之Electric Capital

文章目录 什么是 Electric CapitalElectric团队 Electric Capital 开发者报告参考 什么是 Electric Capital 官网:https://www.electriccapital.com/ 官方github:https://github.com/electric-capital Electric Capital 是一家投资于加密货币、区块链企…

[kubernetes]控制平面ETCD

什么是ETCD CoreOS基于Raft开发的分布式key-value存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)etcd像是专门为集群环境的服务发现和注册而设计,它提供了数据TTL失效、数据改变监视、多值、目录监听、…

面试官95%会问的接口测试知识!

接口测试最近几年被炒的火热了,越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢? 主要是平常的功能点点点,大家水平都一样,是个人都能点,面试时候如果问你平常在公司怎么测试的,你除…

青少年CTF-qsnctf-Web-include01include02(多种方法-知识点较多-建议收藏!)

PHP常见伪协议 php://filter是PHP中独有的一种协议,它是一种过滤器,可以作为一个中间流来过滤其他的数据流。通常使用该协议来读取或者写入部分数据,且在读取和写入之前对数据进行一些过滤,例如base64编码处理,rot13处…

【HDFS联邦(1)】ViewFs与联邦理论知识详解

文章目录 一.ViewFs介绍二. 联邦之前的旧世界1. 单个 namenode集群2. 路径使用逻辑 三. 新世界 – 联邦与ViewFs1. How The Clusters Look2. 使用 ViewFs 为每个集群创建全局的Namespace2. 路径使用逻辑3. 路径使用最佳实践(ing) 本文主要想讨论 HDFS Vi…

基于JSP+Servlet+Mysql的调查管理系统

基于JSPServletMysql的调查管理系统 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库3.登录4.注册3.首页5.系统管理 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称:基于JSPServlet的调查管理系统 项目架构:B/S架构 开发语言&#…

MT3608 高效率1.2MHz2A升压转换器和MT3608L 高效率1.2MHz 2.5A升压转换器 MT3608L和MT3608的区别

MT3608是一个恒定的频率,6引脚SOT23电流模式升压转换器的小,低功耗应用的目的。该MT3608开关在1.2MHz,并允许微小的,低成本的电容器和电感器使用2毫米或更小的高度内部软启动浪涌电流的结果,并延长电池寿命。 …

Jenkins拉去Gitlab代码ssh方式凭证及私钥凭证

Jenkins要从Gitlab拉去代码,则需要在Jenkins配置凭证,同时在配置私钥 Jenkins->凭证->系统->全局凭证->添加凭证 同上图路径进入全局凭证配置页面 点击全局 再点左侧的添加凭证 选择"Username with password",输入…

w15初识php基础

一、计算100之内的偶数之和 实现思路 所有的偶数除2都为0 代码实现 <?php # 记录100以内的偶数和 $number1; $num0; while($number<100){if($number%20){ $num$number;}$number1; } echo $num; ?>输出的结果 二、计算100之内的奇数之和 实现思路 所有的奇数除…

dubbo线程池为什么耗尽

文章概述 大家可能都遇到过DUBBO线程池打满这个问题&#xff0c;报错如下&#xff0c;本文我们就一起分析DUBBO线程池打满这个问题。 cause: org.apache.dubbo.remoting.RemotingException: Server side(10.0.0.100,20881) thread pool is exhausted, detail msg:Thread pool …

IDEA的facets和artifacts

在软件开发领域&#xff0c;IDEA 是指 JetBrains 公司的 IntelliJ IDEA&#xff0c;是一款流行的集成开发环境&#xff08;Integrated Development Environment&#xff09;。在 IntelliJ IDEA 中&#xff0c;"facets" 和 "artifacts" 是两个概念&#xff…

【学习代码】PyTorch代码 练习

文章目录 AttentionSEAttention【显式地建模特征通道之间的相互依赖关系】【easy】CBAM Attention【SEAttention通道注意力 空间注意力】【middle】SelfAttention【重点&#xff1a;理解意义 and 实践&#xff01;】【hard】 Attention SEAttention【显式地建模特征通道之间的…

找到字符串中所有字母异位词--滑动窗口

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本体题目链接https://leetcode.cn/problems/VabMRr/description/ 算法原理 滑动窗口其实就是种双指针&#xff0c;只是这种双指针只向后移动&#xff0c;不会回退&#xff0c;具有单调性&#xff0c;也就是说&#xff0c;…

C语言的分支和循环语句

各位少年&#xff0c;今天和大家分享的是分支语句循环体语句&#xff0c;C语言是结构体的程序设计语言&#xff0c;这里的结构指的是&#xff08;顺序结构&#xff09;&#xff08;选择结构&#xff09;&#xff08;循环结构&#xff09;C语言是能够实现这三种结构的&#xff0…

了解树和学习二叉树

1.树 1.1 概念 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看 起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 。 注意&#xff1a;树形结构中…

html网页编写语言

html是一门语言&#xff0c;所有的网页都是用html这门语言编写出来的。 HTML&#xff08;HyperText Markup Language&#xff09;&#xff1a;超文本标记语言。 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息&#xff0c;还可以定义图片&…

产品原型设计软件 Axure RP 9 mac支持多人写作设计

axure rp 9 mac是一款产品原型设计软件&#xff0c;它可以让你在上面任意构建草图、框线图、流程图以及产品模型&#xff0c;还能够注释一些重要地方&#xff0c;axure rp汉化版可支持同时多人写作设计和版本管理控制&#xff0c;这款交互式原型设计工具可以帮助设计者制作出高…