java - 高性能和线程安全的初始化块
问题描述
我只是偶然发现了以下代码,我想知道是否有更漂亮的替代方案具有相同的性能。
if (!isInitialized) {
synchronized (this) {
if (!isInitialized) {
// Initialization code
isInitialized = true;
}
}
}
当然,可以删除外部 if 语句,而不会影响线程安全。但是当多个线程同时调用代码时,它会对性能产生影响,因为 isInitialized 检查只能在一个线程中一次完成。
在静态上下文中进行初始化是没有选择的。
解决方案
这种双重检查习惯用法(用于双重检查锁定的 DCI 或 DCL)因其指令重新排序的缺陷而闻名。
它仅在您将isInitialized
变量声明为 volatile 时才有效,并且仅适用于 jdk1.5+(当 volatile 语义和内存模型得到修复时)。
老实说,它不再那么常见了,有这么多坏消息……哈哈。
推荐阅读
- node.js - 多次请求时出现内部服务器错误,nginx + node.js + pm2
- java - 在Spring Boot中没有外键的Rest api返回项
- docker - 如何与 docker 机器共享本地主机的文件
- sql - 如何在医院数据库中创建触发器?
- wpf - 我可以使用 ViewBox 作为 WPF 中图像的源吗?
- c# - 在 UI 上过滤 ObservableCollection 项
- python - uniq、groupby 的用例,没有排序
- sql - SQL中列值为空时如何返回默认值
- php - 将 Instagram 页面地址转换为用户名
- c# - 处理模板 api/[TodoController] 时,找不到令牌 TodoController 的替换值