设计模式:单例模式之双检锁/双重校验锁

设计模式:单例模式 Java,c++单例模式的实现以及详解 阅读详情

谈到单例模式,首先需要说明一下,单例模式(Singleton Pattern)是JAVA中最简单的设计模式之一。这种类型的设计模式属于创建型模式。保证一个类仅有一个实例,并提供一个访问它的全局访问点。

要实现一个线程安全的单例模式有多种做法。常见的有懒汉式、饿汉式、双检锁/双重校验锁、静态内部类、枚举等方式。每种方式都有优缺点,并不偏向某一种创建方式。具体情况具体分析,然后采用比较好的创建方式才是最明智的选择。

在这里我采用双检锁/双重校验锁方式来创建一个线程安全的单例模式。

package com.singleton;

import java.util.Arrays;

/**
 * 线程安全的单例模式
 * 双检锁/双重校验锁,volatile关键字一定要加,不然在会存在多线程并发时候可能返回半初始化对象
 * 详情可以在我的头条号 ‘小辉GE’ 查看对应单例模式视频,里面有详细讲解
 *
 * @author 小辉GE/小辉哥
 * <p>
 * 2019年8月7日 下午21:30:00
 */
public class Singleton {
    private static volatile Singleton single = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (single == null) {
            synchronized (Singleton.class) {
                if (single == null) {
                    single = new Singleton();
                }
            }
        }
        return single;
    }

    public static void main(String[] args) {
        Thread[] th = new Thread[100];
        for (int i = 0; i < th.length; i++) {
            th[i] = new Thread(() -> {
                System.out.println(Singleton.getInstance().hashCode());
            });
        }
        Arrays.asList(th).forEach(o -> o.start());
    }
}

测试输出结果如下(输出结果比较多,我们只截取部分):

关于双检锁/双重校验锁创建方式为什么需要volatile,详情可以在我的头条号‘小辉GE’查看对应单例模式视频,里面有详细讲解

以上代码仅供参考,如有不当之处,欢迎指出!!!

更多干货,欢迎大家关注和联系我。期待和大家一起更好的交流、探讨技术!!!

 

go设计模式之单例模式 go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生。 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单... 阅读详情

相关推荐

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文提供《秦时明月》6.2魔改版从零开始的完整部署指南。详细讲解CentOS服务器环境准备、服务端文件部署与安装、关键端口开放及进程验证。重点涵盖安卓客户端APK的IP修改与重签名方法,并介绍了GM后台工具的访问与使用,助你快速搭建并管理专属游戏服务器。

garlic的博客 310

双检加锁机制

尽管双重检查锁定在性能上有一定的优势,但也需要小心使用,因为它在一些早期版本的Java中存在一些问题,如指令重排问题。因此,在现代Java版本中,可以考虑使用其他线程安全的延迟初始化方法,如静态内部类或枚举类型单例,以避免潜在的问题。

m0_54187478的博客 2309

cocos creator接入微信登陆sdk ios篇

cocos creator接入微信登陆sdk ios篇 背景已经在Android篇里面交代过了,有兴趣的朋友可以再看看Android篇 步骤 去微信开放平台下载ios平台所需要的sdk 在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id 在“info”标签栏的“LSApplicationQueriesSchemes“添加weixin 将SDK文件中...

凤小鹿的博客 6362

双检锁/双重校验锁(DCL,即 double-checked locking)详细解析

单例模式是最常用的设计模式,并且双锁单例模式也是面试的常考题目。本文详细介绍了双锁单例模式,并总结了双锁单例模式的三个常考问题。

weixin_44214900的博客 1万+

MaxEnt软件的下载与安装

1、下载网站:http://lucky-boy.ys168.com/ (这是之前在网上搜到的,里面有许多软件安装包,感谢网页主的资源共享,违权必删)

weixin_42191203的博客 2万+

在不同版本Python中安装PyQT5及PyQT5-Tools

在不同版本Python中安装PyQT5及PyQT5-Tools

zoomgu680的博客 2万+

双重检查锁定(Double-Checked Locking)的问题和解决方案

在4处的线程正在初始化实例instance,但是instance引用的对象有可能还没有完成初始化,因为发生了指令重排。3.如果getInstance()方法不会被多个线程频繁的调用,那么这个延迟初始化方案将能提供令人满意的性能。4处因为指令重排,引发的1处拿到的实例在使用的时候发生空指针的问题。在4处,对象创建好之后,执行getInstance()方法将不需要获取锁,直接返回已创建好的对象。2.如果getInstance()方法被多个线程频繁的调用,将会导致程序执行性能的下降。

qq_24099547的博客 2388

ESP32C3的I2S接口详解:以驱动PCM5102A为例,避开时序与配置的那些坑

本文深入解析ESP32C3的I2S接口驱动PCM5102A DAC的完整解决方案,涵盖时序对齐、PCB优化和寄存器级配置。通过实际案例分享时钟树分析、信号完整性设计和底层调试技巧,帮助开发者避开常见陷阱,实现高质量音频输出。重点探讨了I2S协议栈、电源滤波优化及DMA传输异常处理等关键技术要点。

weixin_30254435的博客 298

深入理解DCL(双重检测锁)单例

深入理解DCL(双重检测锁)单例 如果不使用双重检测锁我们可以直接使用synchronized关键字实现 // 懒汉式 public class Singleton { // 单例对象 private Singleton singleton = null; // 私有构造方法 private Singleton() { } // 获取单例 public static synchronized Singleton getSingleton() {

qq_46054356的博客 1942

MCNP 减方差技巧(最全)

MCNP的减方差技巧,核心在于不显著增加计算时间的前提下,通过修改模拟过程来降低结果的统计误差。尤其适用于,这类问题中粒子很难到达探测器区域,直接模拟效率极低栅元重要性是常用的减方差技巧,该方法主要对计算模型的不同区域定义不同的重要性数值。当粒子从重要性低的区域废物重要性高的区域,产生更多粒子,增大统计量;当从重要性高的区域进入重要性低的区域,会进行,增快计算效率。n= 中子,N;光子,P;电子 Exi= 栅元i的重要性I=栅元总数项目IMP卡是必须的,除非使用了WWN卡如果粒子进入0。

chencheng1127的博客 925

NPU性能榨取手把手教程:RK3588上YOLOv5s多线程部署与120FPS极限探索

RK3588 YOLOv5s多线程部署优化指南 本教程深入解析RK3588芯片上YOLOv5s模型的高性能多线程部署方案。RK3588作为瑞芯微旗舰AIoT芯片,内置三核NPU(6TOPS算力)和硬件加速器(RGA/VPU),为AI推理提供强大支持。通过线程池技术,我们将视频处理的读取、推理、后处理等环节解耦并行,显著提升系统吞吐量。教程详细介绍了从PyTorch到RKNN格式的模型转换流程、INT8量化方法,以及基于RKNN C++ SDK的YOLOv5推理核心实现,帮助开发者最大化发挥RK3588的AI

LXY_LOVE36的博客 973

Java双检锁模式

双检锁单例模式通过两次判空检查实现线程安全,但存在指令重排序风险。对象创建过程包含内存分配、初始化和地址返回三步,其中后两步可能被重排序,导致返回未初始化对象。volatile关键字通过插入内存屏障防止指令重排序:写操作前后和读操作后插入屏障,确保多线程环境下操作顺序的一致性,从而避免返回未完成初始化的实例。这种机制保证了双检锁单例模式在多线程环境下的正确性。

纯洁的小魔鬼 3221

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

单例模式

单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例...

到了这里就是到了家 147

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

浅谈单例设计模式

前言 参考:菜鸟教程 另外:设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 单例模式简介 单例模式介绍 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象

skjhieidf的博客 195

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

设计模式-单例模式

文章目录单例模式介绍实现单例模式实现方式1 饿汉式1.1 饿汉式介绍1.2 饿汉式案例2 懒汉式2.1 懒汉式线程不安全2.1.1 懒汉式线程不安全介绍2.1.2 懒汉式线程不安全案例2.2 懒汉式线程安全2.2.1 懒汉式线程安全介绍2.2.2 懒汉式线程安全案例3 双检锁/双重校验锁3.1 双检锁/双重校验锁介绍3.2 双检锁/双重校验锁案例4 登记式/静态内部类4.1 登记式/静态内部类介绍4.2 登记式/静态内部类案例5 枚举式5.1 枚举式介绍5.2 枚举式案例 单例模式 单例模式(Singlet

warmsun 184

单例模式 ( Singleton Pattern )之懒汉与饿汉模式与双检锁/双重校验锁(3)

为了保证线程安全,在 getInstance() 方法上添加了 synchronized 关键字,使得在多线程环境下只有一个线程能够进入创建实例。单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。它的特点是无论是否会被使用到,实例对象都在类加载时被创建。饿汉式能够保证在任何时候都能获取到实例对象,适用于简单的单例对象的创建和初始化。在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例;

qq_36255346的博客 987

手写单例模式:不会就尴尬了

手写单例模式 介绍: 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决:一个全局使用的类频繁地创建与销毁。 何时使用:当您想控制实例数目,节省系统资源的时候。 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码:构造函数是私有的。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点: 没有接口,不能继承,与单一职责原则冲突

weixin_44587820的博客 5783

单例模式的五种写法

设计模式(Design pattern),提供了在软件开发过程中面临的一些问题的最佳解决方案,是Java开发者必修的一门课程。主要分创建型模式、结构型模式和行为型模式。其中接下来我们要写的是单例模式,属于创建型模式。 单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧...

absolute_chen的博客 24万+

2、设计模式之单例模式

设计模式之单例模式:饿汉式、懒汉式、枚举类、静态内部类、双重校验锁等实现方式

天空之蓝的博客 974

单例模式:懒汉式 饿汉式 双检锁 登记式 枚举式 详细讲解

保证一个类仅有一个实例,并提供一个访问它的全局访问点。一个全局使用的类频繁地创建与销毁。当您想控制实例数目,节省系统资源的时候。判断系统是否已经有这个单例,如果有则返回,如果没有则创建。关键代码:构造函数是私有的。1、一个班级只有一个班主任。2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。

小颖同学 946

设计模式(一)、单例模式-双检锁/双重校验锁

单例模式的懒汉式要想线程安全,除了加同步锁外,还有其他解决方法。如:双重锁机制,静态内部类,枚举。。。。本文主要是双重锁机制 加同步锁的懒汉式: public class SingletonTest { private static SingletonTest singeltonTest; //构造方法私有化,上面创建一个对象后就不能在new新的对象,保证对象只有一个 private SingletonTest() { } public static synchronize

流浪猫 821

5分钟掌握设计模式之:单例模式

5分钟掌握设计模式之:单例模式 本文思维导图 什么是单例模式 简介 单例模式属于创建型模式,它保证一个类只有一个实例,并提供唯一节点访问该实例。 单例模式主要解决一个全局使用的类被频繁地创建与销毁对象,浪费系统资源的问题。 使用单例模式时首先要判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 单例模式的构造函数是私有的。 单例模式是设计模式中使用很频...

木头人i 1126

【设计模式】创建型模式(三):单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时 确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

Data · Model · Agent · Repeat 1601

单例模式中的懒汉模式,饿汉模式 , 双检锁/双重校验锁

单例模式 单例模式是java中最简单的设置模式之一,属于创建型设计模式,它提供了一种创建对象最佳方法. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一的对象方式,可以直接访问,不需要实例化该类的对象; 单例总结 1, 单例类只有一个实例; 2, 单例类必须自己创建自己的唯一实例; 3, 单例类必须给所有其他对象提供这一实例; 确保一个类仅有一个实例化,提供全局唯一访问点,主要解决了一个全局的类频繁的创建与销毁 ; 减少不必要的资源浪费; 关键代码

我的目标是CEO,最近小目标是项目架构师! 861

JAVA设计模式-单例模式

在java面试过程中(当然了,不能只是出于面试的目的去学设计模式,要做一个有理想的程序员),设计模式是一定会问到的一环,而其中的单例模式因为比较简单,而且设计到的面比较广,线程安全、内存模型、类加载机制、反射等基础知识,比较好拿出来考察面试者。 ...

wdquan19851029的专栏 1302
上一篇: 面试锦集:JAVA中存在i+1小于i的情况吗?
下一篇: 深入浅出设计模式:单例模式之静态内部类
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值