JUC 单例模式样例(极限性能优化)

什么是单例模式

单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供全局访问点。单例模式通常用于管理全局状态、资源共享或限制资源访问的情况下。

样例代码

这串代码出自《并发编程的艺术》

样例中使用了双重检查锁来实现了单例模式,这串代码相当巧妙,属于极限性能优化的经典样例。

java 复制代码
public class Singleton { 
    private volatile static Singleton singleton;
    private Singleton (){} 
    public static Singleton getSingleton() { 
    if (singleton == null) { 
        synchronized (Singleton.class) { 
            if (singleton == null) { 
                singleton = new Singleton(); 
            }  
        }  
    }  
    return singleton;  
    }  
}

代码解析

这串代码在创建对象时用了两次判空操作,也就是双重检查。

首先设置了一个全局变量singleton

java 复制代码
private volatile static Singleton singleton;

加volatile的作用是及时知道是否创建对象,防止更多的线程再次进入阻塞队列,在第一次判空时起作用。

随后使构造方法私有

java 复制代码
private Singleton (){}

目的是为了让外面不能new对象

随后给予创建对象的方法getSingleton(),这个方法和私有的构造方法保证了单例模式的实现。

在方法内先进行了一次判空,如果是空赶紧锁起来并创建一个对象,当不为空时就可以拦截其他所有的线程。

java 复制代码
if (singleton == null)

随后写了一个同步块,使用 Singleton.class 作为锁对象,在多个线程同时进来的情况下,将第一个锁线程起来,只允许一个线程创建对象。 随后进行了第二次判空,同样是为了保证在多线程的情况下,拦截除第一线程外的所有队列线程

这样避免了多个线程同时通过第一次检查,然后进入同步块,从而提高了性能。

java 复制代码
if (singleton == null) { 
    singleton = new Singleton(); 
}  

在第二次判空后就可以创建对象了。

最后返回Singleton,即返回 Singleton 的唯一实例。

这串代码是经典的懒汉式单例模式实现,并在此基础上做了性能优化,使用了双重检查锁和 volatile 关键字。代码中在极大的情况下提高了性能,实现了单例模式。

相关推荐
编程的一拳超人4 分钟前
Maven 国内高速镜像推荐(按速度排序)
java·maven
云烟成雨TD31 分钟前
Spring AI 1.x 系列【61】Spring AI 2.0 升级指南
java·人工智能·spring
lulu12165440781 小时前
OpenRouter Fusion 多模型融合架构深度拆解:预算级模型组团打平 Fable 5,多模型协作才是 AGI 的正确打开方式?
java·人工智能·架构·ai编程·agi
雨辰AI1 小时前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
(Charon)2 小时前
【C++ 面试高频:内存管理、RAII 和智能指针详解】
java·开发语言·word
凡人叶枫2 小时前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
轻刀快马3 小时前
跨越软硬件的共鸣(二):从 Cache 写策略看 Redis 与 DB 的一致性博弈
java·开发语言·redis·计算机组成原理
折哥的程序人生 · 物流技术专研3 小时前
Java 23 种设计模式:从踩坑到精通 | 装饰器模式 —— 比继承更灵活的扩展方式,你用过吗?
java·装饰器模式·java面试·结构型模式·java设计模式·javaio·从踩坑到精通
lili00123 小时前
2026 企业 AI 选型新范式:OpenRouter Fusion 证明多模型融合性价比远超单模型,企业该如何重构技术栈? - 微元算力(weytoken)
java·人工智能·python·重构·ai编程