并发编程之可见性

137 阅读2分钟

编发编程之可见性

并发编程的3大特性

1、 可见性

2、顺序性

3、原子性

主内存和线程本地内存

2个线程,共享同一个静态变量,如何保证2个线程对同一个静态变量都能可见?

volatile 保障线性间,共享对象的可见性

ps : system.out.println()函数内部使用了 synchronized 修饰 this,涉及了锁。

CPU的计算单元

1、 register < 1ns

2、 LI cache 约定于1ns

3、 L2 cache 约 3ns

4、 L3 cache 约 15ns

5、 main memory 约 80ns

CPU结构以及内存

1、 一台电脑上可以是多个CPU

2、一个CPU上可以有多个核心线程数

3、内存

4、寄存器

5、3级缓存

L1 cache

L1 cache

L1 cache

6、内存 memory

缓存的可见性

缓存的可见性,指的是 L2 cache 的可见性

缓存行

为了更高的效率,寄存器从内存读取数据,要一块一块的读取,一次读取的数据成为一个缓存行。

1、程序的局部性原理

1.1 空间局部性原理

读取相邻的数据,读满一个缓存行

1.2 时间局部性原理

针对指令的加载和执行。

2、缓存行大小 64个字节

3、缓存行对齐填充

3.1 1.7版本的JDK 中LinkedBlockQueue 使用的缓存填充

3.2 Disrubt 组件,也使用了缓存行填充

3.3 1.8版本JDK,@Contended 注解

@Contended 注解,使之被修饰的变量,不会和别的数据出现在同一个缓存行中,意思是它修饰的变量独占一个缓存行。

1.9版本JDK 之后,不生效。其中在1.8版本JDK中使用需要加上 JVM 参数 “-XX:-districtContended” 参数。

4、缓存行的4个状态

modified

exclusice

shared

invalid

5、为什么缓存行大小是 64个字节

缓存行越大,局部性空间效率越高,但读取的时间消耗多;

缓存行越小,局部性空间效率越低,但读取的时间消耗少;

经过工业测试之后,取了一个折中的值,即为 64个字节。

缓存一致性协议

1、实现缓存一致性协议的机制

2、MESI 协议和缓冲一致性协议的区别

缓存一致性协议的实现机制有很多,比较热点的是因特尔公司的MESI 缓存一致性协议。MESI 缓存一致性协议是实现缓存一致性协议中的一种。

3、寄存器从内存操作数据的顺序

3.1 读取顺序

寄存器,先从L1 cache 读取,然后从L2 cache 读取,再从L3 cache 读取,最后从内存读取。

3.2 写入顺序

写入顺序和读取的顺序是相反的。