重排序、hb、ConcurrentHashMap弱一致性(jdk1.6)
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变量:count和table;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)相关推荐
- 【java】ConcurrentHashMap遍历 --- 弱一致性的迭代器(Iterator)实现原理
1.概述 转载:ConcurrentHashMap遍历 - 弱一致性的迭代器(Iterator)实现原理 在 Java并发编程实战(进阶篇) 中分析了 Vector 在迭代过程中对容器进行修改会抛出 ...
- Java之内存模型的基础、重排序、顺序一致性、volatile、锁、final
为什么80%的码农都做不了架构师?>>> 深入理解Java内存模型(一)--基础 深入理解Java内存模型(二)--重排序 深入理解Java内存模型(三)--顺序一致性 深入理 ...
- java基础—java内存模型(JMM)CPU架构、缓存一致性、重排序、JMM的实现、JMM保证可见性、有序性问题的详解
java基础-JMM(CPU架构.JMM保证可见性.有序性) 文章目录 java基础-JMM(CPU架构.JMM保证可见性.有序性) CPU架构 说一说现在计算机存储器的结构层次 使用CPU缓存,会导 ...
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...
- 重排序与happens-before
文章目录 (一)重排序 (1)为什么要进行指令重排序? (二)顺序一致性模型与JMM的保证 (1)顺序一致性模型 (2)JMM中未同步程序的顺序一致性效果 (三)happens-before (1)基 ...
- 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )
文章目录 总结 一.指令重排序规范 二.指令重排序示例 总结 Java 并发的 333 特性 : 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 ...
- Java之volatile如何保证可见性和指令重排序
1 我们先了解CPU缓存 CPU缓存为了解决CPU运算速度与内存读写速度不匹配的问题,因为CPU运算速度要比内存读写速度快得多 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要 ...
- java 链接重排序_JAVA中JVM的重排序详细介绍
重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段.重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境 在并发程序中,程序员会特别关注不同进程或 ...
- 指令重排序及Happens-before法则随笔
指令重排序 对主存的一次访问一般花费硬件的数百次时钟周期.处理器通过缓存(caching)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序.也就是说,程序的读写操作不一定会按 ...
最新文章
- JavaScript 关闭窗口事件
- kafka(一)-为什么使用kafka
- 【实战 Ids4】║ 又一个项目迁移完成(MVC)
- 制作自己的特色PE----Mr.Zhang
- 手动安装cloudera cdh4.2 hadoop + hbase + hive(一)
- OpenCV——读取图片的数据类型必须是int8类型吗?
- 这个 WebKit 漏洞助力 Pwn2Own 冠军斩获5.5万美元赏金(详细分析)
- background相关属性
- php 查看常量值,[thinkphp]查看thinkphp系统定义的常量值
- zepto.js学习笔记01
- 2017年节假日放假安排来了!
- HDU 5037 贪心
- gmail更改个人信息_如何在不创建新电子邮件地址的情况下更改Gmail名称
- 什么是MES生产管理和生产制造执行系统?有哪些系统模块组成?
- 浅谈 SIM-OTA
- 牛掰!SSH端口嗅探方法及其防御技术
- 梦幻新开服务器维护,梦幻西游12月新开服务器
- 本体李俊火星大学最新演讲:从区块链核心价值谈金融场景应用
- linux下邮件服务器 qmail sendmail postfix - 三种MTA的比较
- soft lockup的分类和定位方法