double pi  = 3.14;    //A
double r   = 1.0;     //B
double area = pi * r * r; //C

1、A -> B    //不满足happens- before,不会改变程序执行结果

2、B -> C   //happens- before, 会改变程序执行结果

3、A -> C   //happens- before, 会改变程序执行结果

JMM会对1进行重排序,2、3不会;

在一个线程内,

按照代码顺序,同个字段,书写在前面的操作先行发生于书写在后面的操作

在多线程并发中:

对一个monitor的解锁操作happens-before后续对同一个monitor的加锁操作”、

“对某个volatile字段的写操作happens-before后续对同一个volatile字段的读操作

ConcurrentHashMap

Segment里有两个volatile变量:counttable;HashEntry里有一个volatile变量:value

get方法弱一致性

含义:往ConcurrentHashMap底层数据结构中加入一个元素后,不能立马对get可见。换句话说,put操作将一个元素加入到底层数据结构后,get可能在某段时间内还看不到这个元素;

因为get方法未加锁,get方法可能会在put方法的执行过程中被调用,这就是get操作是弱一致的根本原因;

另外,在put方法调用结束的时候,get方法一定能获取到值,这是如何保证的呢,因为有一个volatile修饰的变量count的存在,put结束的时候,会写入count,get开始的时候会读取count,这里存在happens- before关系

(对某个volatile字段的写操作happens-before后续对同一个volatile字段的读操作);

但是,因为get方法未加锁,所以不能保证在put方法调用结束的时候调用get,可能在中间时刻调用(即使put方法已经赋值完成),导致不存在happens- before关系,可能会因为指令重排等原因不能及时得到值;

迭代器弱一致性表现

在遍历过程中,如果已经遍历的数组上的内容变化了,迭代器不会抛出ConcurrentModificationException异常。

因为未加锁,如果未遍历的数组上的内容发生了变化,则有可能反映到迭代过程中,与get类似;

转载于:https://www.cnblogs.com/chenpi/p/5381857.html

重排序、hb、ConcurrentHashMap弱一致性(jdk1.6)相关推荐

  1. 【java】ConcurrentHashMap遍历 --- 弱一致性的迭代器(Iterator)实现原理

    1.概述 转载:ConcurrentHashMap遍历 - 弱一致性的迭代器(Iterator)实现原理 在 Java并发编程实战(进阶篇) 中分析了 Vector 在迭代过程中对容器进行修改会抛出 ...

  2. Java之内存模型的基础、重排序、顺序一致性、volatile、锁、final

    为什么80%的码农都做不了架构师?>>>    深入理解Java内存模型(一)--基础 深入理解Java内存模型(二)--重排序 深入理解Java内存模型(三)--顺序一致性 深入理 ...

  3. java基础—java内存模型(JMM)CPU架构、缓存一致性、重排序、JMM的实现、JMM保证可见性、有序性问题的详解

    java基础-JMM(CPU架构.JMM保证可见性.有序性) 文章目录 java基础-JMM(CPU架构.JMM保证可见性.有序性) CPU架构 说一说现在计算机存储器的结构层次 使用CPU缓存,会导 ...

  4. Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  5. 重排序与happens-before

    文章目录 (一)重排序 (1)为什么要进行指令重排序? (二)顺序一致性模型与JMM的保证 (1)顺序一致性模型 (2)JMM中未同步程序的顺序一致性效果 (三)happens-before (1)基 ...

  6. 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )

    文章目录 总结 一.指令重排序规范 二.指令重排序示例 总结 Java 并发的 333 特性 : 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 ...

  7. Java之volatile如何保证可见性和指令重排序

    1 我们先了解CPU缓存 CPU缓存为了解决CPU运算速度与内存读写速度不匹配的问题,因为CPU运算速度要比内存读写速度快得多 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要 ...

  8. java 链接重排序_JAVA中JVM的重排序详细介绍

    重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段.重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境 在并发程序中,程序员会特别关注不同进程或 ...

  9. 指令重排序及Happens-before法则随笔

    指令重排序 对主存的一次访问一般花费硬件的数百次时钟周期.处理器通过缓存(caching)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序.也就是说,程序的读写操作不一定会按 ...

最新文章

  1. JavaScript 关闭窗口事件
  2. kafka(一)-为什么使用kafka
  3. 【实战 Ids4】║ 又一个项目迁移完成(MVC)
  4. 制作自己的特色PE----Mr.Zhang
  5. 手动安装cloudera cdh4.2 hadoop + hbase + hive(一)
  6. OpenCV——读取图片的数据类型必须是int8类型吗?
  7. 这个 WebKit 漏洞助力 Pwn2Own 冠军斩获5.5万美元赏金(详细分析)
  8. background相关属性
  9. php 查看常量值,[thinkphp]查看thinkphp系统定义的常量值
  10. zepto.js学习笔记01
  11. 2017年节假日放假安排来了!
  12. HDU 5037 贪心
  13. gmail更改个人信息_如何在不创建新电子邮件地址的情况下更改Gmail名称
  14. 什么是MES生产管理和生产制造执行系统?有哪些系统模块组成?
  15. 浅谈 SIM-OTA
  16. 牛掰!SSH端口嗅探方法及其防御技术
  17. 梦幻新开服务器维护,梦幻西游12月新开服务器
  18. 本体李俊火星大学最新演讲:从区块链核心价值谈金融场景应用
  19. linux下邮件服务器 qmail sendmail postfix - 三种MTA的比较
  20. soft lockup的分类和定位方法

热门文章

  1. 谷歌AI乳腺癌检测超过人类,LeCun质疑引起讨论
  2. 制药行业SAP项目里的那些MES系统
  3. 比Keras更好用的机器学习“模型包”:0代码上手做模型
  4. SAP S/4 HANA的物料编码40位设置
  5. CVPR 2019最佳论文重磅出炉!李飞飞获计算机视觉基础贡献奖
  6. 中国31个金融中心城市
  7. 如何正确实施人工智能
  8. 人工智能激活千亿级交通安全市场
  9. SAP MIGO 报错-在例程WERT_SIMULIEREN字段NEUER_PREIS中字段溢出-
  10. 让AI有道德!用AI的方式去发展AI