volatile双重锁实现单例
双重锁实现单例时遭到质疑,既是:双重锁也无法保证单例模式!
原因是:指令会重排序,普通的变量仅仅会保证该方法在执行时,所有依赖的赋值结果是正确的,但不会保证执行顺序!
为什么会重排序:指令重排序是指cpu采用了允许将多条指令不按照程序的顺序分开发送各相应电路单元处理,cpu不会任意排序(深入java虚拟机第12章),但需要重排序提高性能。
怎么解决,标题也写明白了。
使用volatile关键字!
为什么使用volatile关键字可以实现:此关键字会禁止指令重排序,即:增加了内存屏障!
如果是一个cpu内存屏障是毫无意义的,如果是多cpu访问同一块内存,并且其中一个在观测另一个,就需要内存屏障来保证一执行了。
如果你打开编译后的代码清单,会看到加入volatile关键字的变量会多一条指令:lock addl $0x0 ,(%esp)
此指令很有意义:lock addl $0x0 指令的作用是使当前cpu的cache值写入内存,该写入操作也会引起其他cpu或者内核无效化其cache,既是是做了一个空操作(store、write),可以让volatile变量对其他cpu立即可见!
1 public class Singleton { 2 3 private volatile static Singleton singleton = null; 4 5 public static Singleton getSingleton() { 6 if (singleton == null) { 7 synchronized (Singleton.class) { 8 if (singleton == null) { 9 singleton = new Singleton(); 10 } 11 } 12 } 13 return singleton; 14 } 15 }
View Code
另外:volatile屏蔽指令重排序的语义,在jdk1.5中才被完全修复!
转载于:https://www.cnblogs.com/zhaoliu/p/5389972.html
volatile双重锁实现单例相关推荐
- 菜鸟之路-浅谈设计模式之单例设计模式
单例设计模式 定义:确保一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 单例模式是一种经常使用的软件设计模式.在它的核心结构中仅仅包括一个被称为单例的特殊类. 通过单例模式能够保证系统 ...
- java双重检查锁单例真的线程安全吗?
相信大多数同学在面试当中都遇到过手写单例模式的题目,那么如何写一个完美的单例是面试者需要深究的问题,因为一个严谨的单例模式说不定就直接决定了面试结果,今天我们就要来讲讲看似线程安全的双重检查锁单例模 ...
- 为什么我强烈建议大家使用枚举来实现单例
转载自 为什么我墙裂建议大家使用枚举来实现单例 关于单例模式,我的博客中有很多文章介绍过.作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单.因为在设计单例的时候要考虑很多问题, ...
- 为什么我墙裂建议大家使用枚举来实现单例。
关于单例模式,我的博客中有很多文章介绍过.作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单.因为在设计单例的时候要考虑很多问题,比如线程安全问题.序列化对单例的破坏等. 单例相关文 ...
- Java单例模式详解--七种单例模式实现+单例安全+实际应用场景
单例模式 保证了一个类只有一个实例,并且提供了一个全局访问点.单例模式的主要作用是节省公共资源,方便控制,避免多个实例造成的问题. 实现单例模式的三点: 私有构造函数 私有静态变量维护对象实例 公有静 ...
- java 单例类_Java单例类
单例类: 主要知识点: 1,单例类概念.特点 2,三种单例类懒汉,饿汉,双重加锁举例, 3,懒汉.饿汉区别以及单例类的总结: 1,概念:java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单 ...
- C# 深入单例(回笼)
对所学,所做做一个总结,也算是自己的一个另类总结吧!从单例开始,从遇到的问题和有感触的问题开始,杂乱无章,写入随笔 --by ling 此处从什么是单例,为什么要用单例,实现单例模式的整体思路三个方面 ...
- apollo 7.0——单例设计模式解析
文章目录 单例模式 饿汉模式 懒汉模式 线程不安全 单检锁 双检锁 Meyers 单例 apollo中单例模式 Instance 方法 CleanUp 方法 单例模式 三个要点: 提供对唯一实例的全局 ...
- 菜鸟学设计模式——小单例有大秘密
欢迎大家关注我的新书<Spring Boot趣味实战课> 京东 当当 天猫 单例模式大家并不陌生,也都知道它分为什么懒汉式.饿汉式之类的.但是你对单例模式的理解足够透彻吗?今天我带大家一起 ...
最新文章
- contos7设置固定ip和dns_CentOS7 修改设置静态IP和DNS
- Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version 错误解决
- Codeforces Round #636 (Div. 3) D. Constant Palindrome Sum 思维 + 差分
- “陪护机器人”研报:距离真正“陪护”还差那么一点
- 应用计算机网络的方面,计算机网络技术在电子信息工程中的应用研究(1)
- java atomiclong 使用_Java并发AtomicLongArray类
- windows如何添加本机dns记录_Mac的100个必备技巧,Windows的功能在Mac能用了
- Python数据类型(元组、列表、字符串、字典)
- STM32工作笔记0068---SPI同步通信Flash读写实验
- 关于银行,有哪些有趣的冷知识
- 字符设备驱动之Led驱动学习记录
- 二、kafka基本操作和管理
- 百度文库免费下载最新攻略,全新的百度文库下载方式
- 富士通服务器irmc账号密码,PRIMERGY TX1330 M2 E3-1200 V5单路 Fujitsu富士通立式服务器...
- 20sccm_SCCM安装及配置过程总结
- Android仿QQ微信开场导航以及登陆界面
- Java暑期实训任务二——单词检测程序
- MATLAB如何输出图形到CAD或者UG,ug里面怎么导出cad图形
- win11强行退回win10
- (15):响应式设计