主要参考了“深入理解JAVA内存模型”系列博文,一点自己的理解。
一、volatile
1.1 对于重排序(包括代码重排,指令重排)的影响
是否能重排序 第二个操作 第一个操作 普通读/写 volatile读 volatile写 普通读/写 NO volatile读 NO NO NO volatile写 NO NO
归纳起来就是:
- 当第二个操作是volatile写时,不管第一个操作是什么,都不能重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。
- 当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前。
- 当第一个操作是volatile写,第二个操作是volatile读时,不能重排序。
其中前两项是针对单个线程的,它们保证当volatile类型的变量写入时,值是正确的(不会有后面的语句跑到前面去,也不会有前面的语句跑到后面去,而volatile变量的赋值可能用到了这些普通变量);当volatile类型的变量读入后,后续变量的值是正确的(因为它们的赋值可能用到volatile变量)。
第三项则是针对多线程,可以做到多个线程的隐式同步。当A线程先写了volatile共享变量,而B线程后读了volatile变量,则两个线程不须加锁,B线程的读就会等到A线程的写完成再执行。并且B线程读的时候,两个线程的所有共享变量(包括普通共享变量,即没有volatile修饰过的)都会对B线程可见(即已经刷新到主内存了,而并非保存在B线程的本地内存)。
唯一令人不解的是:A线程的写,怎么能在语义上是happens-before线程B的读呢?莫非是A线程的start调用早于B线程?
上述机制的内存实现(通过内存屏障):
在每个volatile写操作的前面插入一个StoreStore屏障。 在每个volatile写操作的前面插入一个StoreLoad屏障。 在每个volatile读操作的后面插入一个LoadLoad屏障。 在每个volatile读操作的后面插入一个LoadStore屏障。
原文写的有误,令人好生迷茫了一阵子。
至于内存屏障的优化等内容,参照原文即可,没有问题。
相关推荐
在深入理解Java内存模型(JMM)及并发三大特性方面,我们需要先建立对多线程、共享内存模型、可见性、有序性和原子性的基础概念。Java内存模型是Java并发编程的核心,它定义了共享变量在多线程环境中的行为规则和...
Java模拟器JMM3.0是一款专为智能手机设计的软件,旨在为用户提供Java应用程序和游戏的支持。在智能手机领域,Java由于其跨平台性和强大的功能,曾经是开发移动应用的主流选择,尤其是对于早期的非智能手机。JMM3.0...
Java内存模型详解JMM Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)中的一种内存模型,它描述了程序中各个变量之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节...
Java内存模型,简称JMM(Java Memory Model),是Java虚拟机规范中定义的一个抽象概念,它描述了在多线程环境下,如何保证各个线程对共享数据的一致性视图。JMM的主要目标是定义程序中各个变量的访问规则,以及在...
### 三问JMM——有关JVM内存模型的深度解析 #### 前言 近期,在诚信通开源研究小组的专题学习分享会上,我们针对Java内存模型(JMM)进行了深入探讨,现将JMM相关的一些核心概念进行梳理,以便更好地理解和把握JMM的...
《美国钻石JMM-512-V512技术手册》是针对一款专业级音频处理设备的详尽指南,主要面向工程师、技术人员以及对音频系统有深入兴趣的用户。这份手册详细介绍了JMM-512-V512的功能、操作方法以及其在音频制作中的应用。...
Java内存模型(JMM,Java Memory Model)是Java平台中用于定义线程间如何共享变量以及如何同步操作的重要概念。最新版的JMM模拟器提供了一种可视化的方式,帮助开发者理解并模拟Java内存模型的工作机制,这对于理解...
Java内存模型(JMM, Java Memory Model)是Java平台中用于定义如何在多线程环境下共享数据的一种规范。它规定了线程之间的交互、数据的可见性以及如何避免数据的不一致性等问题。JMM的存在主要是为了解决处理器缓存...
Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的...
【JMM(Java Memory Model,Java 内存模型)】是Java平台中用于规范线程间通信和数据同步的一种模型。它定义了线程如何共享和访问内存,以及在并发环境下如何保证数据一致性。JMM规定了 volatile 变量、synchronized...
sgys108jmm1.apk
深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...
jmm模型ppt基本概念介绍 Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)中的一种抽象概念,描述了一组规则或规范,定义了程序中各个变量的访问方式。JMM围绕原子性、有序性、可见性展开,确保了Java...
Java内存模型(Java Memory Model,简称JMM)是Java并发编程中的核心概念,它定义了Java程序中多线程间共享变量的访问规则。理解JMM对于编写正确、高效的并发程序至关重要。本文将深入探讨JMM的原理、特性以及如何在...
5-3JMM-CPU缓存一致性协议MESI.mp4
JVM的基础和调优【JMM 内存结构 GC OOM 性能调优 ThreadLocal】 内存泄露:是指程序在申请内存后,无法释放已申请的内存空间就造成了内存泄露, 一次的内存泄露似乎不会有大的影响,但是内存泄露堆积的后果就是内存...
14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1...
Java内存模型(JMM,Java Memory Model)是Java平台中用于描述如何在多线程环境中管理内存的一套规范。它确保了并发编程时不同线程之间的数据一致性、可见性和原子性,以避免出现数据竞争和其他并发问题。以下是JMM...
Java运行时内存模型图
然而,多线程环境下常常需要处理线程间的同步问题,这就涉及到了等待唤醒机制、Java内存模型(JMM)以及volatile关键字。本篇文章将深入探讨这些概念,并通过一个生产者与消费者的案例来具体阐述它们的应用。 **一...