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

相关推荐
FIN技术铺4 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序11 分钟前
vue3 封装request请求
java·前端·typescript·vue
陈王卜29 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、29 分钟前
Spring Boot 注解
java·spring boot
java亮小白199734 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF40 分钟前
java Queue 详解
java·队列
武子康1 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康1 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
苏-言1 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
界面开发小八哥1 小时前
更高效的Java 23开发,IntelliJ IDEA助力全面升级
java·开发语言·ide·intellij-idea·开发工具