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
分类:
JAVA/Spring
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
2022-12-12 关于PowerShell中使用ArgumentList传递数组
2016-12-12 手机端页面自适应之rem布局