范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

一次群聊引发的血案

  就在不久前,读者群因为一个提问引发了激烈的讨论!
  代码如下图:
  从问题来看,大家讨论的问题的焦点在于 map 去 put 一个对象的时候,究竟会不会因为对象没有完全初始化完成而导致另外一个线程 get 的时候只是拿到了对象的引用,导致报错呢?
  从提供的代码的写法来看,是一个最基本的DCL稍微改变了的写法,在探讨map的问题之前,我想先从DCL(双重检查校验)说起。DCL的由来
  在最初的时候,我们常规的单例写法就像这样:
  很容易你就应该知道,这段代码不是线程安全的,所以有了加锁的单例方法实现。
  但是synchronized又会导致多线程下性能开销过大,虽然现在优化了,但是早期synchronized的性能是堪忧的,所以就诞生了双重检查锁定DCL的写法。先判断一次null,然后再加锁,这样第一次检查不是null的话就不需要加锁了,就可以避免synchronized的性能开销过大的问题。
  看样子问题是解决了,就很棒的样子,但是回到开头说的问题。DCL的问题
  从CPU的角度来看,instance = new Instance()可以分为分为几个步骤:分配对象内存空间执行构造方法,对象初始化instance指向分配的内存地址
  实际上,由于指令重排的问题,2、3的步骤可能会发生重排序,那么问题就发生了。
  instance先被指向内存地址,然后再执行初始化,如果此时另外一个线程来访问getInstance方法,就会拿到instance不是null,最后拿到的将是一个没有被完全初始化的对象!
  实际上,这个问题已经是大部分人都知道的DCL的一个问题了。
  因为根据Java内存模型语义来说,不管编译器和处理器怎么排序,单线程的执行结果都不能改变,只要数据没有依赖关系,就都可以重排序。
  那对上面的例子来说重排序改变了单线程下程序结果吗?并没有,因为无论线程A内是先初始化对象还是先把instance指向分配好的内存地址,对于单线程A的结果来说是没有任何改变的。
  也就是说,对于重排序的结果来说,只要保证线程B在访问对象的时候能拿到instance引用就可以,无论线程A内部初始化和执行内存地址两个步骤怎么重排序都不会影响到最终结果。
  重排序的结果只是造成了线程B拿到的是一个没有完全初始化完成的对象而已,可能这时候构造方法没有执行,拿到的对象属性可能是错误的,也有可能如果拿着这个没有完全初始化完成的对象去操作,可能会导致空指针的问题。
  所以,一般在使用DCL的时候会把变量声明为volatile ,因为volatile的语义会禁止指令重排,而本质上就是加上了内存屏障。一切都是猜测
  如果依据这个解释,来回答群内提出的问题貌似也可以解释的通。
  因为 map 在 put 的时候可以不管 new 对象时候的指令重排,只要能拿到对象引用的内存地址就可以了,所以另外一个线程如果去 get 的话就可能拿到一个空值。
  从as-if-serial的语义来看,确实不会改变单线程内的执行结果,但是还有一点说的是只要数据没有依赖关系,就都可以重排序。问题的关键点在于 put 这个到底有依赖关系吗?依赖关系怎么定义?
  如果是最简单的比如 x=1,y=2  那么我们可以认为完全没有依赖关系,可以指令重排。如果是 x=1,y=x+1  那么由于单线程内y 依赖于x ,所以不能指令重排。
  那么 map.put(key,new B(value))  呢?一道证明题
  Jcstress(Java Concurrency Stress)是一个帮助测试JVM和硬件并发正确性的工具库。
  首先,先证明DCL的问题是否确实存在,是否真的在另外的线程中能看到未完全初始化的对象。代码如下:
  通过测试代码,如果最终能输出0,1,2,3那么代表确实是能拿到未完全初始化完成的对象。
  首先对代码 mvn clean install  打包,然后执行命令:java -XX:-UseCompressedOops -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand="print com.jcst.UnsafePublication_jcstress*::call" -XX:CompileCommand="inline, com.jcst.UnsafePublication::publish" -XX:+PrintAssembly -jar target/jcstress.jar -f -1 -t UnsafePublication -v > log2.txt 
  执行完成之后,查看输出结果发现问题确实存在:
  而且,通过生成的汇编指令,也可以看到发生了指令重排,引用被先赋值,对象还没有完全初始化完成。但是实际测试过程中,这个问题并不好复现,需要反复的测试才有可能拿到我们想要的结果。
  有了基础的事实之后,再继续修改代码,如果加上 map 操作还能出现这个现象的话,那么证明实际上 map 的 put 操作也是同样存在可能性的。
  如果同样我们能得到汇编的结果,put 的操作也被指令重排发生在初始化完成之前的话,那么就可以证明我们的猜测了。
  结果和我们之前预料的不太一致,无论怎么修改代码顺序,测试脚本都是执行通过。这说明 put 不会把一个没有初始化完成的对象给保存进去。
  总结
  由于指令重排发生的场景非常多而且也非常底层,目前我们能看到的资料无非就告诉我们单线程结果不能改变,数据不能有依赖性,这样的话就能指令重排。
  而我们的代码从 Java 通过 javac 编译成字节码,再经过 JIT 动态编译成机器码,从机器码再经过处理器,到缓存这些过程都可能发生指令重排。而编译器、处理器、缓存这些根据机器、硬件环境不同,又都可能造成不同的影响。
  通过DCL的已知问题和最后根据jcstress得到汇编的结果来看,由于没有改变单线程最终结果,指令重排是确实发生了。但是从 map 的 put 的结果来看,最终结论是不会,put 操作不会把一个没有初始化完成的对象保存进去。
  而我也尝试了不少其他的方式,比如打印、模拟 map 写了一个空方法,只是用到了引用对象,测试结果无一都是通过,所以大胆猜测使用了引用其实也是依赖的一种,这样就不会导致重排的发生。
  最后,如果你有更好的证实的方法,或者有不同的意见可以证实结论的错误性,欢迎拍砖打脸指正。

刘昊然疑遭AI换脸侮辱诽谤言论等,目前刘昊然工作室已报警8月28日1014分,刘昊然工作室发文称注意到网络传播出大量利用AI换脸技术制作的视频(含视频截图)对刘昊然先生进行侮辱及言语诽谤的聊天记录。关于1月份传播内容已进行澄清,非但没有张予曦和刘学义恋爱了?双方工作室先后回应,男方说词含糊关于张予曦和刘学义恋爱传闻,此前据网友爆料,曾看到在横店某小区刘学义到张予曦家中,是张予曦给刘学义卡的门。次日,二人才先后从张予曦家中走出来。近日,又有八卦媒体拍到在横店这个小区,肖战生日三大消息发长文谈三十而立,工作室晒写真,新剧照公布今天,除了是我们国庆假期的喜庆日子,也是演员肖战30岁的生日,在这美好的一天,我们能看到很多朋友向他送来祝福,更有不少关于他的生日动态,微博热搜可谓是居高不下,受到了非常多网友们的这三大姓氏,在历史上兴盛了3000多年,你在其中吗?说起中国的姓氏,很多人可能就会想到百家姓,也可以随口就背出赵钱孙李,周吴郑王。中国的姓氏有单姓,也有复姓,甚至还有两字以上的姓氏,而且这些姓氏和中国的历史一样已经传承了数千年。不管英雄隐居40多年无人识,却因孙子参军,主动曝光身份,令人敬佩众所周知,从清末时期开始,完成了工业革命的列强,开始想方设法侵占中国。比如英法联军侵华八国联军侵华日本侵华等战争。在这些战争中,日本侵华战争可以说我国遭受最严重的伤害,当时的我国没老师,我家就一男娃,别让他打扫卫生,老师的回答让家长深思最近一段时间,家长们都在讨论这起新闻一位二年级学生家长,得知儿子在学校被班主任安排值日,立马发信息制止。理由是儿子是家里唯一的宝贝男孩,没做过家务,如果学校有需要,她和孩子爸爸可以为何权志龙和金智妮恋爱,我却想到了央视与KBS的合作?2月24日,有韩国爆料狙击手之称的D社在当天曝出权志龙和JENNIE已经恋爱一年。要知道D社前不久爆料的玄彬与孙艺珍的恋情就被官宣了,所以这次爆料权志龙和JENNIE的恋情,大批网王思聪多金舔狗也被拒,罪魁祸首竟是精英教育?从6月15日凌晨开始,国民老公王思聪就与一个叫孙一宁的网红隔空开战起来。他们你来我往,一个以搜集黑料,发誓锤死对方为开头,雷声大,雨点小另一个则以疯狗回敬对方,并奉上双方的聊天记录网友八卦秦昊和保姆一起带孩子,伊能静霸气回怼自从伊能静通过乘风破浪的姐姐翻红,她和秦昊就一直被网友们关注着,一举一动都会被无限地放大。而这次正是因为网友的过分关注,就闹出了一个大乌龙,真是令人哭笑不得。在伊能静的社交平台上,给林家生了三个儿子,为何陈若仪如此自卑?林志颖态度让人心寒婆媳关系一直是大众的热门话题,这不,最近有一部新的综艺妈妈与婆婆就是展现明星婆媳关系的,在节目中,可能最受关注的还是林志颖与陈若仪夫妇吧,因为陈若仪虽然大家都知道她的存在,但是却不来看看明星分手时的微博文案,最让人感动的可能是郑爽胡彦斌说起来明星的感情生活,一直备受大家关注,很多网友都知道明星在谈恋爱的时候要有官宣文案,告诉大家有恋爱对象了,分手的时候也要有分手文案,告诉大家自己恢复单身了。他们的爱情也是生活在大
裴淳华的经典电影,也是她最大胆的作品消失的爱人说起欧美的女明星,如果挑一个最亲华,最喜欢中国文化的人,裴淳华认第二,没人敢认第一!作为国际知名的演员,她的优秀作品无数,而且许多都是属于经典之类的。但要在所有经典当中挑一部最大胆NFT浪潮席卷影视圈影响几何?9月27日,电影青苔花开发布消息,由其全面授权的影视NFT产品即将于10月22日电影公映前上线。10月9日,王家卫首个电影NFT作品花样年华一刹那在苏富比秋季拍卖会上,以428。4这些韩国动作电影你绝对不能错过!韩国暴力美学典范要说哪国动作片最凶残,最有本国特色,那韩国绝对是其中一个!韩国独创的暴力美学,是其他国家不能媲美的打斗流畅,简单粗暴,拳拳到肉看的那叫一个过瘾今天剧集弟就带你们来看一下哪些动作电影河南多数景区接待游客人数成几何倍数增长还透露出这些信号大河网讯(记者刘杨)万物复苏,春光正好,4月7日,大河网记者从河南省文化和旅游厅获悉,随着疫情形势不断好转,作为疫情缓解后的第一个小长假,今年的清明节,河南各地旅游消费热情逐渐恢复日媒评选东京奥运会MVP,水谷隼当选,成色几何?东京奥运会结束后,日媒展开了一系列的投票和调查,作为东道主,日本代表团拿到27金。东京奥运会上那么多奥运冠军,谁才是MVP呢,水谷隼当选。日本夺金最佳名场面,属于乒乓球混双金牌,水2021最新中国留美学生返美流程须知(最新返美政策入境核酸检测隔离签证所需证件机票注意事项)新冠疫情的到来,可以说是影响到了每个人的生活,从2020年2月起,美国就限制了来自中国旅客入境,于是导致了无数留学生无法返校盘点哈利波特的牛元素,它们不仅出现在巫师的餐桌上牛年的第一天,祝各位哈迷们在新的一年中牛转钱坤,事事顺心。既然牛年来了,新年的第一篇推文,小斯就来为大家说一说魔法世界中的牛元素。1牛料理牛料理,是巫师餐桌上必不可少的硬菜,尤其是戴安娜穿搭绝了!勇夺英女王最爱的格纹元素穿个遍,飒气十足在时尚圈,有一种花纹元素是永恒经典永不过时的。它简单大气,只有黑白两个颜色,百搭时髦。秋冬搭配长靴大衣,春夏搭配T恤衬衫,似乎什么样的款式都能搭配得上,而且时髦又减龄。它便是一年四惊艳大片!西班牙5比3淘汰克罗地亚,精彩与惊奇元素丰富无比北京时间6月29日0时,欧洲杯18淘汰赛中,由克罗地亚VS西班牙队。曾经的世界杯欧洲杯冠军的西班牙队,在小组赛前两场两连平,末轮才以50大胜斯洛伐克后出线,也因此受到了不少批评。西天赐的声音越来越糊?其实推荐金曲的诞生,三个元素缺一不可天赐的声音这期很有意思,演职人员戴着口罩录节目,嘉宾戴透明口罩坐台上,表演时又全程正常表演。这是走形势还是真防护?是不是有为节目造势的嫌疑?不管怎样,天赐的声音本来有望成为和歌手当周也的高冷气质抹不掉,穿无袖裙看着清秀大方,好似油画美人今天穿什么变美百科全书穿搭红黑榜无论搭配什么样的时装风格,很多人都会把搭配的重点,放在时装的选择上以及时装的搭配中,但是很少有人会把注意力放在除了裙子之外的其他的搭配。其实最简单的