内存屏障和volatile内存语义的实现

趁周末,把以前的书拿出来,再翻一番,顺便做个笔记:

内存屏障:用来控制和规范cpu对内存操作的顺序的cpu指令。

内存屏障列表:

1.loadload:确保“前者数据装载”先于“后者装载指令”;

2.storestore:确保“前者数据”先于“后者数据”刷入系统内存,且,“前者刷入系统内存的数据”对“后者是可见的”;

3.loadstore:确保“前者装载数据”先于“后者刷新数据到系统内存”;

4.storeload:确保“前者刷入系统内存”的数据对“后者加载数据”是可见;

volatile的内存语义的(JVM)实现策略:

1.在每个volatile写操作前,会插入一个storeload屏障;

2.在每个volatile写操作后,会插入一个storeload屏障;

3.在每个volatile读操作后,会插入一个loadstore屏障和loadload屏障。

其上为java并发编程方向的理论基础知识。

时间: 2024-10-09 08:44:40

内存屏障和volatile内存语义的实现的相关文章

内存屏障和 volatile 语义

背景 在阅读java中volatile的关键词语义时,发现很多书中都使用了重排序这个词来描述,同时又讲到了线程工作内存和主存等等相关知识.但是只用那些书的抽象定义进行理解时总是感觉什么地方说不通,最后发现,是那些书中使用的抽象屏蔽了一些对读者的知识点,反而导致了理解上的困难.因此有了这篇文章.没有任何虚构的理解抽象,从硬件的角度来理解什么是内存屏障,以及内存屏障如何让volatile工作.最后说明了在多线程中,如何使用volatile来提升性能. 存储结构 在计算机之中,存在着多级的存储结构.这

volatile关键字?MESI协议?指令重排?内存屏障?这都是啥玩意

一.摘要 三级缓存,MESI缓存一致性协议,指令重排,内存屏障,JMM,volatile.单拿一个出来,想必大家对这些概念应该有一定了解.但是这些东西有什么必然的联系,或者他们之间究竟有什么前世今生想必是困扰大家的一个问题.为什么有了MESI协议,我们还需要volatile?内存屏障的由来?指令重排带来的问题?下面我们通过分析每一个技术的由来,以及带来的负面影响,跟大家探讨一下这些技术之间的联系.具体每个关键词相关文章也很多不再赘述,只谈个人理解. 二.三级缓存篇 1,三级缓存的由来 CPU的发

LINUX内核内存屏障

================= ================= By: David Howells <[email protected]> Paul E. McKenney <[email protected]> 译: kouu <[email protected]> 出处: Linux内核文档 -- Documentation/memory-barriers.txt 文件夹: (*) 内存訪问抽象模型. - 操作设备. - 保证. (*) 什么是内存屏障? -

深入java内存模型(二) volatile详解

对于volatile修饰符,我们应该不会陌生,在多线程中使用常见,比如多个线程想用一个全局变量作为标识符,或者一个共享变量,我们都会给该变量加上一个volatile的修饰符.volatile用中文解释是易变的,不稳定的.说明该变量会被多个线程访问并可能修改.那么jvm是怎样发挥volatile关键字的作用,如何实现的呢? 上一篇深入java内存模型中解释了jvm中的重排序以及四种内存屏障等.jvm总是会以一些易懂,使用方便的方式来实现相关功能.比如垃圾回收器,对于内存的申请与释放时一个令人头疼的

深入理解JVM读书笔记五: Java内存模型与Volatile关键字

12.2硬件的效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了. 基于高速缓存的存储交互很好地理解了处理器与内存的速度矛盾,但是也为计算机系统带来了更高的复杂度,因为它引入了一个新的问题: 缓存一致性(Cache Coherenc

重排序和内存屏障指令

参考及相关文献: [java并发编程艺术](https://book.douban.com/subject/26591326/) jmm cookbook synchronized-doug lee jsr 133 英语好有时间的同学,建议瞄一眼此博文去读参考文献内容. 1. 写缓冲区 现在的处理器使用写缓冲区临时保存写入内存的数据,写缓冲区的优点是: 可以保证指令持续运行,避免由于处理器等待向内存写入而产生的停顿延迟: 以批处理的方式刷新写缓冲区,及合并写缓冲区中对同一个内存地址的多次写操作,

盲猜原子变量、内存屏障、内存模型、锁之间的关系

1.atomic_flag 和atomic<>的区别,atomic_flag 无论无锁是多大代价(一些cpu可能无锁代价大),都保证atomic_flag 是无锁的.atomic<>会视情况,可能是有锁的也可能是无锁的,哪个开销小选哪个. 2.C++内存模型可以被看作是C++程序和计算机系统(包括编译器,多核CPU等可能对程序进行乱序优化的软硬件)之间的契约,它规定了多个线程访问同一个内存地址时的语义,以及某个线程对内存地址的更新何时能被其它线程看见.C++11 中的 atomic

内存屏障

原文地址:http://ifeve.com/memory-barriers-or-fences/ 本文我将和大家讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术. CPU使用了很多优化技术来实现一个目标:CPU执行单元的速度要远超主存访问速度.在上一篇文章 “Write Combing (合并写)”中我已经介绍了其中的一项技术.CPU避免内存访问延迟最常见的技术是将指令管道化,然后尽量重排这些管道的执行以最大化利用缓存,从而把

原子操作&amp;优化和内存屏障

原子操作 假定运行在两个CPU上的两个内核控制路径试图执行非原子操作同时"读-修改-写"同一存储器单元.首先,两个CPU都试图读同一单元,但是存储器仲裁器插手,只允许其中的一个访问而让另一个延迟.然而,当第一个读操作已经完成后,延迟的CPU从那个存储器单元正好读到同一个(旧)值.然后,两个CPU都试图向那个存储器单元写一新值,总线存储器访问再一次被存储器仲裁器串行化,最终,两个写操作都成功.但是,全局的结果是不对的,因为两个CPU写入同一(新)值.因此,两个交错的"读-修改-