当前位置: 首页 > news >正文

多线程下单例如何保证

系列文章目录

文章目录

  • 系列文章目录
  • 一、方法
    • 1、懒汉式+双重检查锁
    • 2、饿汉式静态初始化
    • 3、使用静态内部类(懒汉式的一种变体)
    • 4、使用 AtomicReference
    • 5、使用依赖注入框架,Spring


一、方法


懒汉式:延迟加载,第一次调用getInstance()才能创建对象
饿汉式:立即加载,类加载时就创建对象

1、懒汉式+双重检查锁

package com.example.demo;public class SingleTest {private static volatile SingleTest instance;private SingleTest(){}private static SingleTest getInstance() {if (instance == null) {synchronized (SingleTest.class) {if (instance == null) {instance = new SingleTest();}}}return instance;}public static void main(String[] args) {new Thread(() -> {SingleTest singleTest1 = SingleTest.getInstance();System.out.println("singleTest1: " + singleTest1);}).start();new Thread(() -> {SingleTest singleTest2 = SingleTest.getInstance();System.out.println("singleTest2: " + singleTest2);}).start();new Thread(() -> {SingleTest singleTest3 = SingleTest.getInstance();System.out.println("singleTest3: " + singleTest3);}).start();}
}

2、饿汉式静态初始化

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

3、使用静态内部类(懒汉式的一种变体)

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

4、使用 AtomicReference

import java.util.concurrent.atomic.AtomicReference;public class Singleton {private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<>();private Singleton() {}public static Singleton getInstance() {for (;;) {Singleton current = INSTANCE.get();if (current != null) {return current;}Singleton newInstance = new Singleton();if (INSTANCE.compareAndSet(null, newInstance)) {return newInstance;}}}
}

5、使用依赖注入框架,Spring

@Component
public class MyService {// ...
}
http://www.xdnf.cn/news/1358353.html

相关文章:

  • elasticsearch 7.x elasticsearch是查询的数据量大于10000分页有问题还是es的库总量大于10000分页有?
  • 【软件安全】ARM64、x86、32 位与 64 位架构的区别、定义、应用背景
  • 安装gitlab
  • Dify 从入门到精通(第 53/100 篇):Dify 的分布式架构(进阶篇)
  • 线程整理文档
  • git学习
  • Wagtail CRX 的 Latest Pages Block 高级设置 模版v3.0 以后被阉割了
  • Vue vs React:前端框架的差异与选择
  • 【SpringBoot集成篇】SpringBoot 深度集成 Elasticsearch 搜索引擎指南
  • 代码性能测试——benchmark库
  • 基于Spring Boot与Redis的电商场景面试问答解析
  • Python训练营打卡 DAY 46 通道注意力(SE注意力)
  • 【数据结构】排序算法全解析
  • Linux服务实验
  • [论文阅读] 软件工程 | GPS算法:用“路径摘要”当向导,软件模型检测从此告别“瞎找bug”
  • Kaggle项目:一次 Uber 出行数据分析的完整思路
  • 【机器学习】 11 Mixture models and the EM algorithm
  • 如何捕获组件的异常情况
  • Node.js依赖管理与install及run命令详解
  • Redis实战-缓存的解决方案(一)
  • Flink直接缓冲存储器异常解析与解决方案
  • comfyUI背后的一些技术——CLIP
  • 暗影哨兵:安全运维的隐秘防线
  • 高并发AI服务部署方案:vLLM、TGI、FastChat性能压测报告
  • 使用 Fargate 在 AWS ECS 上运行 Spring Boot 应用程序
  • QML Charts组件之坐标轴示例
  • maven私服架构
  • Tesla智能座舱域控制器(MCU)的系统化梳理
  • ChainVault:重塑亚洲黄金交易基建,引领RWA金融新浪潮
  • Vue 3多语言应用开发实战:vue-i18n深度解析与最佳实践