再探单例模式

再探单例模式

一:故事背景

最近在进行单例模式的复习,今天进行一下对应的总结,分析一下各个设计模式。今天从最简单的单例模式开始。

二:单例重点

  1. 概念
    一个类有且仅有一个实例,并且向整个系统提供这个实例。
  2. 分类
    Java中有两种构建方式,分别是饿汉式和懒汉式。饿汉式的创建方式是私有的静态变量并且实例化,启动时就会创建。懒汉式有线程安全和线程不安全的两种。线程安全的可以通过加synchronized锁实现。
  3. 代码
    这里我们重点分析懒汉模式的代码。
java 复制代码
public class Singleton {

    //1.私有的构造函数
    private Singleton(){
    }
    //静态变量,防止指令重排序,不然的话可能将对象引用复制给了变量,但是却没有调用构造方法。
    private  static volatile Singleton singleton = null;

    //对外提供访问点
    public static Singleton getSingleton(){
        //第一个if判断提高效率
        if(singleton == null){
            synchronized (Singleton.class){
                //获取锁后判断,避免产生多个实例对象
                if (singleton == null){
                    //这不是一个原子操作,先执行 = 在执行 new Singleton();
                    singleton = new Singleton();
                }
            }

        }
        return singleton;
    }

}
  1. 重点
    上述代码重点是两个,第一个是,为什么双重检验。判断单例对象是否为null 。第二个是为什么使用volatile 关键字,作用是什么
    第一个问题,第一层的if判断是为了提升效率,并发获取对象,不用去竞争锁。第二个是避免,多个线程同时走到了synchronized 代码块这里,倒是创建重复的对象。
    第二个问题的原因是通过使用volatile避免指令重排序。导致对象赋值给了singleton但是却没有执行构造函数,倒是出现错误。

三:总结提升

本文简单分析了单例模式,讲解了其中重点。

相关推荐
赛姐在努力.6 分钟前
Spring DI详解--依赖注入的三种方式及优缺点分析
java·mysql·spring
雨中散步撒哈拉15 分钟前
13、做中学 | 初一下期 Golang数组与切片
开发语言·后端·golang
0wioiw017 分钟前
Go基础(③Cobra)
开发语言·后端·golang
楼田莉子25 分钟前
C++算法专题学习:栈相关的算法
开发语言·c++·算法·leetcode
IvanCodes27 分钟前
六、Docker 核心技术:Dockerfile 指令详解
java·数据库·docker
晨非辰30 分钟前
#C语言——刷题攻略:牛客编程入门训练(九):攻克 分支控制(三)、循环控制(一),轻松拿捏!
c语言·开发语言·经验分享·学习方法·visual studio
_oP_i37 分钟前
Java 服务接口中解决跨域(CORS,Cross-Origin Resource Sharing)问题
java·开发语言
陈序猿(代码自用版)1 小时前
【考研C语言编程题】数组元素批量插入实现(含图示+三部曲拆解)
c语言·开发语言·考研
唐•苏凯1 小时前
ArcGIS Pro 遇到严重的应用程序错误而无法启动
开发语言·javascript·ecmascript
用户9446814013501 小时前
部分替代Lombok?不可变数据的载体?一篇文章带你了解JDK16正式引用的record类型!
java