Java中如何实现线程安全的单例模式?

embedded/2025/1/7 21:17:59/

目录

1、懒汉式(线程安全)

2、饿汉式(线程安全)

3、双重校验锁(线程安全)

4、静态内部类(推荐)

5、枚举(最佳方法)

6、总结


在Java中,实现线程安全的单例模式通常有以下几种方式:

1、懒汉式(线程安全)

使用synchronized关键字同步获取实例的方法,确保只有一个线程可以执行该方法,实现线程安全。但这种方式效率较低。

public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}}

2、饿汉式(线程安全)

实例在类加载时就创建,由于类加载机制保证了线程安全,这种方式简单但可能会导致资源浪费。

public class Singleton {private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}}

3、双重校验锁(线程安全)

使用volatile关键字确保多线程环境下的可见性,避免指令重排序导致的问题。双重检查锁定机制在第一次检查实例是否为null时不加锁,只有在实例为null的情况下才进行同步,从而提高性能。

public class Singleton {private volatile static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}}

4、静态内部类(推荐)

利用静态内部类来持有单例实例,该类只会被加载一次,因此确保了实例的唯一性。这种方式结合了懒汉式的延迟加载和线程安全性,是推荐使用的方式之一。

public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}}

5、枚举(最佳方法)

使用枚举来实现单例模式是最简单也是最安全的方式。枚举类型天然支持序列化机制,并且由JVM保证线程安全。

public enum Singleton {INSTANCE;public void someMethod() {// 实现方法}
}

6、总结

在实际应用中,可以根据项目需求和性能要求选择合适的实现方式。通常情况下,使用静态内部类或枚举是较为推荐的做法,它们既简洁又线程安全。


http://www.ppmy.cn/embedded/150573.html

相关文章

.net core 的函数实现

Python基础 Python是一种广泛使用的高级编程语言,以其简洁易读的语法和强大的功能而闻名。它被广泛应用于数据分析、人工智能、网站开发、自动化脚本及其他众多领域。本文将详细介绍Python的基础知识,包括其安装及环境配置、基本语法、数据类型、控制结…

【机器学习】穷理至极,观微知著:微积分的哲思之旅与算法之道

文章目录 微积分基础:理解变化与累积的数学前言一、多重积分的高级应用1.1 高维概率分布的期望值计算1.1.1 多维期望值的定义1.1.2 Python代码实现1.1.3 运行结果1.1.4 结果解读 1.2 特征空间的体积计算1.2.1 单位球体的体积计算1.2.2 Python代码实现1.2.3 运行结果…

高频生活场景带动低频金融服务,美团企业版点燃场景金融建设引擎

撰稿 | 多客 来源 | 贝多财经 近年来,金融与生活、生产场景深度融合衍生出的“场景金融”逐渐进入大众视野。其中,对公业务场景金融以其在服务实体经济、维护金融稳定等层面的前瞻性,成为银行完善场景体系、传递金融温度的“压舱石”。 上海…

uniapp 微信小程序开发使用高德地图、腾讯地图

一、高德地图 1.注册高德地图开放平台账号 (1)创建应用 这个key 第3步骤,配置到项目中locationGps.js 2.下载高德地图微信小程序插件 (1)下载地址 高德地图API | 微信小程序插件 (2)引入项目…

练习题:29

目录 Python题目 题目 题目分析 1. 知识点覆盖分析 2. 连接库选择与导入分析 3. 连接步骤与参数分析 4. 数据库操作与连接关闭分析 代码实现 代码解释 1. 导入必要的库 2. 配置数据库连接参数 3. 建立数据库连接 4. 创建游标对象 5. 编写并执行 SQL 查询语句 6.…

SpringCloudAlibaba 技术栈—Sentinel

1、什么是sentinel? Sentinel是一个用于微服务架构的流量管理和控制系统,它通过限制和控制进入系统的流量,来保护系统免受过载和故障的影响,确保服务的稳定性。简而言之,它就是一个帮助微服务在高负载情况下也能稳定运行的工具。…

在pytest钩子函数中判断Android和iOS设备(方法一)

在一个UI自动化工程里可以执行iOS UI 自动化和Android UI 自动化,那么在有些公共方法里就需要区分是Android手机还是iOS手机,例如,pytest的钩子函数。 在 pytest_runtest_makereport 这个钩子函数中我添加了,截图和重启app的指令…

HTML——20 自定义属性

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>自定义属性</title></head><body><a href"https://ai.m.taobao.com" 自定义属性"属性值">淘宝网</a><a href"h…