Java单例模式

代码

public class SamlUtil
{
private static SamlUtil samlUtil;
private static final Object lock = new Object();
private SamlUtil() {
}
public static SamlUtil getInstance() {
SamlUtil temp = samlUtil;
if (temp == null) {
synchronized (lock) {
temp = samlUtil;
if (temp == null) {
temp = new SamlUtil();
samlUtil = temp;
}
}
}
return samlUtil;
}
}

要点

为什么要double check?

防止多线程竞争状态下单例不“单”

为什么创造temp?

避免指令重排造成单例无实例

可以不引入temp变量,使用volatile关键字

volatile的主要作用是保证变量在多线程上的可见性,它不会改变单线程程序的执行顺序。

public class SamlUtil
{
private static volatile SamlUtil samlUtil;
private static final Object lock = new Object();
private SamlUtil() {
}
public static SamlUtil getInstance() {
if (samlUtil == null) {
synchronized (lock) {
if (samlUtil == null) {
samlUtil = new SamlUtil();
}
}
}
return samlUtil;
}
}

Ref

https://juejin.cn/post/7049327348784562213

posted @   talentzemin  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
历史上的今天:
2022-12-12 关于PowerShell中使用ArgumentList传递数组
2016-12-12 手机端页面自适应之rem布局
点击右上角即可分享
微信分享提示