单例模式实现

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏: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来禁止指令的重排序。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习的一些有趣的点【异常检测】

机器能不能知道自己不知道,而不是给出判断中的一种? Classifier(分类)Anomaly Detection(异常检测) 机器能不能说出为什么知道? 有时候可能是因为数据的问题导致了这种错觉。 机器学习是否会有错…

虾皮跨境电商的收款方式及选择指南

虾皮(Shopee)作为一家知名的跨境电商平台,为卖家提供了多种收款方式,以满足不同卖家的需求。本文将介绍虾皮跨境电商平台的主要收款方式,并提供选择指南,帮助卖家根据自身需求和目标市场选择最合适的收款方…

机器学习---K近邻算法

1. KNN算法 K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,是一个理论上比较成熟的方法,也 是最简单的机器学习算法之一,1968年由 Cover 和 Hart 提出。 该方法的思路是:如果一个样本在特征空间…

人工智能中GAN 的五大有趣应用

引言 你能看出这张照片中面部的共同点吗? 这些人都不是真实存在的!这些面部图像都是由 GAN 技术生成的。 “GAN” 这个词是由 Ian Goodfellow 在 2014 年提出的,但相关概念早在 1990 年就存在了(Jrgen Schmidhuber 开创&#xf…

图像识别中的 Vision Transformers (ViT)

引言 Vision Transformers (ViT) 最近已成为卷积神经网络(CNN) 的竞争替代品,而卷积神经网络 (CNN) 目前在不同的图像识别计算机视觉任务中处于最先进的水平。ViT 模型在计算效率和准确性方面比当前最先进的 (CNN) 模型高出近 4 倍。 Transformer 模型已成为自然语…

【vtkWidgetRepresentation】第十七期 vtkDistanceRepresentation

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkDistanceRepresentation相关内容,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 1. vtkDistanceRep…

ESP8266网络相框采用TFT_eSPI库TJpg_Decoder库mixly库UDP库实现图片传送

用ESP8266和TFT_ESPI模块来显示图片数据。具体来说,我们将使用ILI9431显示器作为显示设备,并通过UDP协议将图片数据从发送端传输到ESP8266。最后,我们将解析这些数据并在TFT屏幕上显示出来。在这个过程中,我们将面临一些编程挑战&…

SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…

05. Springboot admin集成Actuator(一)

目录 1、前言 2、Actuator监控端点 2.1、健康检查 2.2、信息端点 2.3、环境信息 2.4、度量指标 2.5、日志文件查看 2.6、追踪信息 2.7、Beans信息 2.8、Mappings信息 3、快速使用 2.1、添加依赖 2.2、添加配置文件 2.3、启动程序 4、自定义端点Endpoint 5、自定…

【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习

上一篇中我们进行了散列表的相关练习,在这一篇中我们要学习的是并查集。 目录 概念伪代码选择题填空题编程题7-1 朋友圈R7-1 笛卡尔树R7-2 部落R7-3 秀恩爱分得快 在许多实际应用场景中,我们需要对元素进行分组,并且在这些分组中进行查询和修…

常用Python自动化测试框架有哪些?优缺点对比

随着技术的进步和自动化技术的出现,市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整,这些自动化测试框架就能够开箱即用,大大节省了测试时间。而且由于这些框架被广泛使用,他们具有很好的健壮性&#xff0…

代码随想录第三十九天(一刷C语言)|零钱兑换完全平方数

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、零钱兑换 思路:参考carl文档 1、确定dp数组以及下标的含义:凑足总额为j所需钱币的最少个数为dp[j]。 2、确定递推公式:凑足总额为j - coins[i]的最…

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

在新一轮科技革命和产业变革的推动下,制造业正面临绿色化、智能化、服务化和定制化发展趋势。为顺应新技术革命及工业发展模式变化趋势,传统工业化理论需要进行修正和创新。其中,对工业化水平的判断标准从以三次产业比重标准为主回归到工业技…

WEB 3D技术 three.js 通过lil-gui 控制x y z轴数值 操作分组 设置布尔值控制 颜色材质控制

上文 WEB 3D技术 three.js 通过lil-gui管理公共事件中 我们用 lil-gui 处理了一下基础事件和按钮的管理 那么 本文 我们来具体说说它能做的其他事 我们先将基础代码改成这样 import ./style.css import * as THREE from "three"; //引入lil-gui import { GUI } fro…

web逆向经验

一、JS逆向调试流程 如果网页有跳转,必须勾选 preservelog 防止丢包看一下有没有框架 右键查看框架源代码(弹出式登陆界面)登陆尽量使用错误密码 防止跳转查看关键登陆包 分析哪些参数是加密的使用别的浏览器分析哪些参数是固定的值初步猜测加密方法搜索&#xff0…

【Java】从JDK 8迁移到JDK后续版本

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

MySQL 事务的ACID特性

MySQL事务是什么,它就是一组数据库的操作,是访问数据库的程序单元,事务中可能包含一个或者多个 SQL 语句。这些SQL 语句要么都执行、要么都不执行。我们知道,在MySQL 中,有不同的存储引擎,有的存储引擎比如…

凸优化 2:如何判定凸函数?

凸优化 2:如何判定凸函数? 如何判断一个目标函数是凸函数?如果是凸函数,那ta的定义域是凸集合 一个函数求俩次梯度,大于等于0,那这个函数就是一个凸函数在同样条件下,怎么设计为凸函数模型&…

使用 Elasticsearch 检测抄袭 (二)

我在在之前的文章 “使用 Elasticsearch 检测抄袭 (一)” 介绍了如何检文章抄袭。这个在许多的实际使用中非常有意义。我在 CSDN 上的文章也经常被人引用或者抄袭。有的人甚至也不用指明出处。这对文章的作者来说是很不公平的。文章介绍的内容针对很多的…

【星海出品】Keepalived 使用基础案例 (二)

keepalived 使用 [rootmaster ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs { //全局配置notification_email { //定义报警收件人邮件地址acassenfirewall.locfailoverfirewall.locsysadminfirewall.loc}notification_…