申明的变量会放在内存中,一个线程更改之后,之前获取值的线程是对这个变量不可见的
volatile 可以保证变量的可见性,引用类型(包括数组)只能保证本身的可见性,不能保证内部字段的可见性
数据的读取顺序是从cpu的计算机单元寄存器->L1 -> L2 -> L3 ->内存,最终在各个阶段存储一份
cpu多级缓存如下图所示:
缓存一致性协议 MESI Cache
状态 | 描述 | 监听任务 |
---|---|---|
修改 (Modified) | 该Cache line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。 | 缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S(共享)状态之前被延迟执行。 |
独享、互斥 (Exclusive) | 该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中。 | 缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S(共享)状态。 |
共享 (Shared) | 该Cache line有效,数据和内存中的数据一致,数据存在于很多Cache中。 | 缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。 |
无效 (Invalid) | 该Cache line无效。 | 无 |