DeathWhispers

死磕Java并发:Java内存模型之重排序

https://www.iocoder.cn/JUC/sike/jmm-1/ 在执行程序时,为了提高性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下,不能改变程序运行的结果。 存在数据依赖关系的情况下,不允许重排序。 如果看过 LZ 上篇博客的就会知道,其实这两点可以归结于一点:无法通过 h...

死磕Java并发:Java内存模型之总结

摘要: 原创出处http://cmsblogs.com/?p=2167「小明哥」欢迎转载,保留摘要,谢谢! 作为「小明哥」的忠实读者,「老艿艿」略作修改,记录在理解过程中,参考的资料。 经过四篇博客阐述,我相信各位对 Java 内存模型有了最基本认识了,下面 LZ 就做一个比较简单的总结。 1. 总结 老艿艿:此处的总结,内容上不是完全线性的,而是一些概念、原理等等关键点。 J...

死磕Java并发:Java内存模型之从JMM角度分析DCL

1. 问题分析 我们先看单例模式里面的懒汉式: 我们都知道这种写法是错误的,因为它无法保证线程的安全性。优化如下: 优化非常简单,就是在#getInstance()方法上面做了同步,但是synchronized就会导致这个方法比较低效,导致程序性能下降,那么怎么解决呢?聪明的人们想到了双重检查 DCL: 就如上面所示,这个代码看起来很完美,理由如下: 如果检查第一个singleto...

死磕Java并发:Java内存模型之happens-before

https://www.iocoder.cn/JUC/sike/happens-before/ 在上篇博客(《【死磕 Java 并发】—– 深入分析 volatile 的实现原理》)中,LZ 提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题。那么我们正确使用同步、锁的情况下,线程 A 修改了变量 a ,何时对线程 B 可见? 我们无法就所有场景来...