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 关键字。代码中在极大的情况下提高了性能,实现了单例模式。

相关推荐
0x5326 分钟前
Java网络编程(二)
java·服务器·网络
Flittly1 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(三):输出校验与治理闭环实战
java·spring boot·spring
Poo_Chai1 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间1 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
树码小子1 小时前
开启 IDEA 中的断言功能
android·java·intellij-idea
茶本无香1 小时前
Java调用Shell脚本执行SQL数据库操作:从入门到实战
java·sql·shell
风流 少年2 小时前
Spring AI 2.0:MCP
java·后端·spring
天疆说2 小时前
01 硬件选型与 llama.cpp 部署:4× RTX 5880 Ada 跑 DeepSeek-V4-Flash
java·redis·llama
水无痕simon3 小时前
3 短信应用场景以及平台架构
java·服务器