内存屏障、volatile、锁、final

原创 2018年04月16日 16:49:00

1.     硬件层的内存屏障:Load Barrier 和 Store Barrier

作用:阻止屏障两侧的指令重排序;

      强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效。

对于Load Barrier来说,在指令前插入Load Barrier,可以让高速缓存中的数据失效,强制从新从主内存加载数据;

对于Store Barrier来说,在指令后插入Store Barrier,能让写入缓存中的最新数据更新写入主内存,让其他线程可见。

 

2.     volatile内存语义

当对一个volatile变量进行写操作的时候,JMM会把该线程对应的本地内存中的共享变量的值刷新到主内存中。

当读一个volatile变量的时候,JMM会把该线程对应的本地内存设置为无效,要求线程从主内存中读取数据。

 

3.     volatile的实现

根据volatile重排序规则,在写操作前面插入Store Store屏障;在写操作后面插入storeload屏障;在读操作后面插入loadload和loadstore屏障

(基于保守策略)

 

4.     锁的内存语义

锁释放与volatile写语义相同。锁获取与volatile读语义相同。

 

5.     锁的底层实现

依靠volatile变量和cas操作实现。

 

6.     final域内存语义

在对象引用为任意线程可见之前,对象的final域已经被正确初始化过,而普通域不具有这个保证。

 

7.     final域重排序规则

final域是基础数据类型:

在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。

初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。

Final域是引用数据类型:

在构造函数内对一个final引用的对象的成员域的写入,与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jzlcheng/article/details/79962835

volatile和锁的内存语义与实现

1.volatile的内存语义与实现1.1 volatile写读的内存语义在介绍锁的内存语义之前,我们先简单介绍一下volatile写读的内存语义: 当写一个volatile变量时,JMM会把该线程对...
  • tb3039450
  • tb3039450
  • 2017-03-28 14:43:06
  • 512

JMM 重排序、内存屏障、final语义

参考:《Java并发编程的艺术》 1、Java内存模型的基础两个关键问题:线程间如何通信和同步。通信:线程间交换信息。同步:控制不同线程的操作发生的相对顺序。Java采用共享内存进行线程间通信,这个通...
  • datadev_sh
  • datadev_sh
  • 2018-01-11 12:03:24
  • 153

volatile与内存屏障

origin: 内存屏障(Memory barrier)-- 转发 本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构。所有罗列的 Linux 内核代码也均在(或只在...
  • yazhouren
  • yazhouren
  • 2017-06-05 11:00:57
  • 737

聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障

在聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了硬件层提供了满足某些一致性需求的能力,Java内存模型利用了硬件层提供的能力指定了一系列的语法和规则,让Ja...
  • ITer_ZC
  • ITer_ZC
  • 2014-12-18 16:08:03
  • 8745

JMM——volatile与内存屏障

为了实现volatile内存语义,JMM会分别限制编译器重排序和处理器重排序 1.当第一个操作为普通的读或写时,如果第二个操作为volatile写,则编译器不能重排序这两个操作(...
  • hqq2023623
  • hqq2023623
  • 2016-03-30 13:08:08
  • 3766

1.2Java内存模型——原子性、内存可见性、重排序、顺序一致性、volatile、锁、final

一、原子性原子性操作指相应的操作是单一不可分割的操作。例如,对int变量count执行count++d操作就不是原子性操作。因为count++实际上可以分解为3个操作:(1)读取变量count的当前值...
  • qq_31997407
  • qq_31997407
  • 2018-03-26 23:03:43
  • 170

内存屏障与volatile

内存屏障由于现代操作系统都是多处理器操作系统,每个处理器都会有自己的缓存,可能存再不同处理器缓存不一致的问题,而且由于操作系统可能存在重排序,导致读取到错误的数据,因此,操作系统提供了一些内存屏障以解...
  • u011663071
  • u011663071
  • 2018-01-03 20:11:46
  • 175

volatile 与内存屏障

volatile   c语言中 volatile 关键字用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。volatile只能保证编译器不会做乱序执行优化.         1. 不...
  • dzhj11
  • dzhj11
  • 2012-05-10 11:16:13
  • 1678

深入理解Java内存模型

  • 2015年09月22日 16:41
  • 1.19MB
  • 下载

volatile、内存屏障、Acquire&Release语义 三者的差别和关系(一) —— 之volatile

前言: 对于这个题目, 本来想写成一篇博客, 但是写下来发现篇幅有点长, 于是拆分成三篇. volatile 内存屏障 Acquire&Release语义 这三个概念恐怕是做并行编程的时候, 或者...
  • daan_112211
  • daan_112211
  • 2014-03-18 19:53:44
  • 1461
收藏助手
不良信息举报
您举报文章:内存屏障、volatile、锁、final
举报原因:
原因补充:

(最多只允许输入30个字)