前提:内存屏障

内存屏障(Memory Barrier)与内存栅栏(Memory Fence)是同一个概念。

用于阻止指令重排序。保证了特定操作的执行顺序和某些变量的内存可见性。

JMM 内存屏障分为四类:

  • Store:将处理器缓存的数据刷新到内存中。
  • Load:将内存存储的数据拷贝到处理器的缓存中。
屏障类型 指令示例 说明
LoadLoad Load1;LoadLoad;Load2 该屏障确保 Load1 数据的装载先于 Load2 及其后所有装载指令的操作
StoreStore Store1;StoreStore;Store2 该屏障确保 Store1 立刻刷新数据到内存(使其对其他处理器可见)的操作先于 Store2 及其后所有存储指令的操作
LoadStore Load1;LoadStore;Store2 确保 Load1 的数据装载先于 Store2 及其后所有的存储指令刷新数据到内存的操作
StoreLoad Store1;StoreLoad;Load2 该屏障确保 Store1 立刻刷新数据到内存的操作先于 Load2 及其后所有装载装载指令的操作。它会使该屏障之前的所有内存访问指令(存储指令和访问指令)完成之后,才执行该屏障之后的内存访问指令

StoreLoad Barriers 同时具备其他三个屏障的效果,是目前大多数 CPU 所支持的。但是相对其他屏障,该屏障的开销相对昂贵。

一、final

https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.5

声明一个 final 成员时,必须在构造函数退出前设置它的值。

class FinalFieldExample {
final int x; public FinalFieldExample() {
x = 3;

可见性

final 修饰的变量作为不可变变量,只要对象是正确构造的(没有 this 逃逸发生),不需要任何同步措施就可以保证任何线程都能读到变量在构造函数中被初始化之后的值。

关于this逃逸:

https://www.jianshu.com/p/49068f29a460

https://www.hollischuang.com/archives/2583

有序性

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

final 读:“初次读一个包含 final 域的对象的引用” ,与, “随后初次读对象的 final 域”,这两个操作之间不能重排序(先赋值,再调用)。

二、volatile

http://ifeve.com/volatile/

原子性

32 位的 JDK 中 volatile 修饰后的 long 和 double 也具有原子性。但是 volatile int i = 0;i++; 就不具备原子性,因此可以理解为对单次 volatile 变量的读写操作具有原子性,复合操作(如 i++)不具有原子性。

可见性

编译器会为 volatile 修饰的变量的读写操插入内存屏障,被 volatile 修饰的变量在被修改后可以立即同步到主内存,被其修饰的变量在每次是用之前都从主内存刷新。

有序性

CPU 可能对输入代码进行乱序执行,比如 load->add->save 有可能被优化成 load->save->add。内存屏障同样可以来限制处理器对指令进行重排序。


https://www.hollischuang.com/archives/2673

https://www.jianshu.com/p/aa432a918db9

https://www.jianshu.com/p/157279e6efdb

Java-内存模型 final 和 volatile 的内存语义的更多相关文章

  1. 全面理解Java内存模型(JMM)及volatile关键字(转载)

    关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoad ...

  2. 全面理解Java内存模型(JMM)及volatile关键字(转)

    原文地址:全面理解Java内存模型(JMM)及volatile关键字 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型( ...

  3. 深入理解Java内存模型JMM与volatile关键字

    深入理解Java内存模型JMM与volatile关键字 多核并发缓存架构 Java内存模型 Java线程内存模型跟CPU缓存模型类似,是基于CPU缓存模型来建立的,Java线程内存模型是标准化的,屏蔽 ...

  4. Java内存模型之分析volatile

    前篇博客[死磕Java并发]—–深入分析volatile的实现原理 中已经阐述了volatile的特性了: volatile可见性:对一个volatile的读,总可以看到对这个变量最终的写: vola ...

  5. java内存模型-final

    与前面介绍的锁和 volatile 相比较,对 final 域的读和写更像是普通的变量访问.对于final 域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个 final 域的写入,与随后把 ...

  6. 深入理解java虚拟机(6)---内存模型与线程 & Volatile

    其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...

  7. 全面理解Java内存模型(JMM)及volatile关键字

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772461 出自[zejian ...

  8. Java并发编程:JMM (Java内存模型) 以及与volatile关键字详解

    目录 计算机系统的一致性 Java内存模型 内存模型的3个重要特征 原子性 可见性 有序性 指令重排序 volatile关键字 保证可见性和防止指令重排 不能保证原子性 计算机系统的一致性 在现代计算 ...

  9. 简要概述java内存模型,以及volatile关键字

    如果我们要想深入了解Java并发编程,就要先理解好Java内存模型.Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步.原始的Java内存模型效率并不是很理想,因此 ...

随机推荐

  1. 微信小程序onLoad、onShow、onHide、onUnload区别

    onLoad:页面第一次加载时触发,从跳转页面返回时不能触发,可以传递参数 onShow:页面显示或从后台跳回小程序时显示此页面时触发,从跳转页面返回时触发,不能传递参数 onHide:页面隐藏,例如 ...

  2. 搭建vue.js 的npm脚手架

    1.在cmd中,找到nodeJs安装的路径下,运行 vue -V,查看当前vue版本,如下图所示,表明已经安装过了. 2.没有安装,进行安装.在cmd中,找到nodeJs安装的路径下,运命令行 npm ...

  3. QQ大盗 - 巧用clientkey

    场景: 1.将程序发给好友,好友打开 qq昵称就会被秒改为”账号已被盗“. 2.将程序运行在自己的电脑,让那些随意借用电脑看片聊天的室友产生一个觉悟:乱使用别人电脑很可能会泄露隐私. 思路: 通过数据 ...

  4. 《python解释器源码剖析》第7章--python中的set对象

    7.0 序 集合和字典一样,都是性能非常高效的数据结构,性能高效的原因就在于底层使用了哈希表.因此集合和字典的原理本质上是一样的,都是把值映射成索引,通过索引去查找. 7.1 PySetObject ...

  5. bootstap 表格自动换行 截取超长数据

    <table class="table" style="TABLE-LAYOUT:fixed;WORD-WRAP:break_word">

  6. PXC集群的概述及搭建

    目录 PXC集群的概述及搭建 PXC集群的简介 PXC集群主要由两部分组成: PXC的特性和优点: PXC的局限和劣势: PXC原理描述 在Centos部署基于Mysql高可用方案操作过程 新增节点加 ...

  7. 三、Nginx支持php

    一.php fastcgi配置(分析宝塔的) 因为只是配置PHP,所以只需要改动server部分 关于phpmyadmin这个站点的信息: 查找该文件:

  8. 数据库——Oracle(5)

    1 唯一约束: 1)修改表的时候设置唯一约束 alter table 表名 add constraint 约束名 unique(列名1,列名2,列名3...) create table worker8 ...

  9. 如何用eclipse进行jar文件打包?

    直接导出runnable jar,如下图所示: 然后选择导出runnable jar: 关于library handling部分的解释如下: (1)Extract required libraries ...

  10. Bind+DLZ构建企业智能DNS/DNS

    Bind+DLZ构建企业智能DNS   目录:一.简介二.服务规划三.安装BIND及基本环境四.配置Bind-View-DLZ-MYSQL五.添加相关记录并进行测试六.配置从DNS七.补充 一.简介: ...