double pi = 3.14; //A double r = 1.0; //B double area = pi * r * r; //C
一、A -> B //不知足happens- before,不会改变程序执行结果数组
二、B -> C //happens- before, 会改变程序执行结果数据结构
三、A -> C //happens- before, 会改变程序执行结果多线程
JMM会对1进行重排序,二、3不会;并发
在一个线程内,app
按照代码顺序,同个字段,书写在前面的操做先行发生于书写在后面的操做spa
在多线程并发中:线程
对一个monitor的解锁操做happens-before后续对同一个monitor的加锁操做”、code
“对某个volatile字段的写操做happens-before后续对同一个volatile字段的读操做blog
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相似;