在上一篇文章中,小编为您详细介绍了关于《车载导航是否可以用高德地图?IBM服务器插了张PCI网卡无法识别40》相关知识。本篇中小编将再为您讲解标题java 单例模式中双重检查锁定 volatile 的作用?为什么样在Java里面string s= new String("John"); s = new String(&quo。

volatile 是保证了可见性还是有序性?
有序性:是因为 instance = new Singleton(); 不是原子操作。编译器存在指令重排,从而存在线程① 创建实例后(初始化未完成),线程② 判断对象不为空,但实际对象扔为空,造成错误。
可见性:是因为线程① 创建实例后还只存在自己线程的工作内存,未更新到主存。线程 ② 判断对象为空,创建实例,从而存在多实例错误。
题主自己都说了,可见性和有序性两者都有。
既然涉及到这两者,自然会想到happens-before规则。目前大部分对这类问题的分析,都是比较简单粗暴的从可见性、原子性、有序性等角度来说。题主可以试试利用happens-before规则来分析,这也很有意思。
*************** 以下更新 ****************
之前回答的时候没细想,看了 @陈大白 的答案才想起来,这里的instance变量本身不存在可见性问题。但是,instance对象内部的字段,如果不是final,那么存在可见性问题。
public class LazySingleton { private int someField; private static LazySingleton instance; private LazySingleton() { this.someField = ①; // (①) } public static LazySingleton getInstance() { if (instance == null) { // (②) synchronized(LazySingleton.class) { // (③) if (instance == null) { // (④) instance = new LazySingleton(); // (⑤) } } } return instance; // (⑥) } public int getSomeField() { return this.someField; // (⑦) }}
简而言之,当你通过上面的getInstance方法拿到①个LazySingleton实例以后,去调用实例的getSomeField方法,是没法保证能看到①这个值的。
可以证明,(⑦) happens before (①)是不成立的。
先上图
题目中s是有用对象,可达。不属于内存泄露。
内存泄露的例子:
Vector v = new Vector(①⓪);
for (int i = ①; i
编后语:关于《java 单例模式中双重检查锁定 volatile 的作用?为什么样在Java里面string s= new String("John"); s = new String(&quo》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《现在的魔兽世界和60年代(2005年)有哪些区别?玩魔兽世界~~谁牌子的9550显卡最好》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器