单例模式,DCL double check loading
new 一个对象时,存在两个过程,一个是赋默认值,一个是赋初始值。
class T {
m = 8;
}
T t = new T();
三个指令,开辟 t 的内存空间,给t的成员变量赋默认值,给成员变量赋初值,
loading -> linking [verification , preparation, resolution] initializing
然后在赋值引用,可能存在指令重排序
JMM java mermory model, java 内存模型
硬件层的并发优化基础知识
存储层的知识结构
内存一致性协议, 为了不同CPU访问修改同一个数据造成的数据不一致的问题
读取缓存以cache line为基本单位,目前64bytes
位于同一缓存行的两个不同数据,被两个不同CPU锁定,产生互相影响的伪共享问题
使用 缓存行的对齐,需要考虑需要浪费空间的问题
cpu 读取指令,一次可以读取多条指令执行。
cpu 会在一条指令(读内存数据)执行中,执行其他的指令,其他的指令与当前指令没有练习
合并写
WriteCombing buffer 四个字节,写满之后,存储到L2
指令重排序
volatile 避免指令重拍,线程可见性