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

相关推荐
极客柒1 分钟前
Unity 协程GC优化记录
java·unity·游戏引擎
我要去腾讯2 分钟前
Springcloud核心组件之Sentinel详解
java·spring cloud·sentinel
czhc11400756633 分钟前
Java117 最长公共前缀
java·数据结构·算法
weixin_3077791335 分钟前
AWS Elastic Beanstalk 实现 Java 应用高可用部署指南
java·开发语言·云计算·aws·web app
萝卜白菜。1 小时前
关于Java EE应用中xml解析类的问题
xml·java·java-ee
一米阳光zw1 小时前
Spring Boot中使用 MDC实现请求TraceId全链路透传
java·spring boot·后端·traceid·mdc
王元_SmallA1 小时前
pgsql:connection failed connection to server at
java·后端
高山上有一只小老虎1 小时前
购物消费打折
java·算法
tuokuac1 小时前
@Configuration类中定义的@Bean方法
java
百锦再2 小时前
第8章 模块系统
android·java·开发语言·python·ai·rust·go