Java内存模型Jmm与volatile可见性

1.volatile

能够保证线程的可见性,当一个线程在修改我们主内存中的共享变量的数据时候,能够对另外一个线程可见。
注意: volatile 关键字是不能够保证原子性。
特性:保证可见性、防止重排序、不能保证原子性。”

2.如何停止线程

1代码

Java内存模型Jmm与volatile可见性_第1张图片
结果:
1s后没有停止,因为 FLAG不可见
Java内存模型Jmm与volatile可见性_第2张图片
改进:
增加volatile
Java内存模型Jmm与volatile可见性_第3张图片

3.多线程不可见

因为我们Cpu直接操作我们主内存数据的时候( 共享的全局变量,)整个效率是非常低,所以在这时候就产生了三级缓存。
L11213
相当手在每个cpu中都有自己独立高速缓存,在高速缓存中主要存放主内存中共享变量中的副本数据。
注意:每个cpu中副本数据相互之间是可见的,而且是相互不影响。

Cpu在这个时候直接访问我们副本数据,肯定比访问主内存数据效率要高。
Java内存模型Jmm与volatile可见性_第4张图片
Java内存模型Jmm与volatile可见性_第5张图片

4.什么主内存

主内存中实际存放就是我们共享变量的数据_堆大方法区
Java内存模型Jmm与volatile可见性_第6张图片

5.什么工作内存

指的其实就是我们主内存共享变量数据的副本。

程独占状态
(2) unlock(解锁): 作用于主内存的变量,把一一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
(3) read(读取): 作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
(4) load(载入): 作用于工作内存的变量,它把read操作主内存中得到的变量值入工作内存的变量副本
(5) use(使用):作用于工作内存的变量,把工作内存中的一一个变量值传递给执行引擎
(6) assign(赋值):作用于工作内存的变量,它把一一 个从执行引擎接收到的值赋给.工作内存的变量
(7) store(存储): 作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作
(8) write(写入):作用于。工作内存的变量,它把store 操作从工作内存中的-一个变量的值传送主内存的变量
Java内存模型Jmm与volatile可见性_第7张图片
Java内存模型Jmm与volatile可见性_第8张图片

MESI协议

1.M修改(Modified)这行数据有效,数据被修改了,和主内存中的数据不- -致,数据
在于本Cache中。
2.E独享、互斥(Exclusive)这行数据有效,数据和主内存中的数据一致,数据只存在
Cache中。
3.S共享(Shared)这行数据有效,数据和主内存中的数据一-致, 数据存在于很多Cach
4.I无效(Invalid) 这行数据无效。

E:独享:当只有一个cpu线程的情况下,cpu副本数据与主内存数据如果
保持一致的情况 下,则该cpu状态为E状态独享。
S:共享:在多个cpu线程的情况了下,每个cpu副本之间数据如果保持一致
的情况下,则当前cpu状态为S
M:如果当前cpu副本数据如果与主内存中的数据不一致的情况下,则当前cpu状态
为M
I:总线嗅探机制变为无效多个cpu之间副本数据不一致性

总线:

维护解决cpu高速缓存副本数据之间-一致性问题。

你可能感兴趣的:(7期)