JMM内存模型八大原子性操作
2024-02-06 10:39:39 0 举报
JMM(Java内存模型)定义了8种原子性操作,以确保不同线程在执行过程中对共享内存的访问和操作保持正确性和一致性。以下是核心内容: 1. lock(锁定):将一个变量标识为一条线程独占的状态。 2. unlock(解锁):将一个锁定的变量解除锁定,使得其他线程可以锁定该变量。 3. read(读取):将主内存的一个变量值加载到工作内存中。 4. load(载入):将read操作读取的变量值保存到工作内存的变量副本中。 5. use(使用):将工作内存中的一个变量值传递给执行引擎,以供其执行操作。 6. assign(赋值):将执行引擎计算出来的值赋值给工作内存中的变量。 7. store(存储):将工作内存中的变量值传送到主内存。 8. write(写入):将store操作传送到主内存的变量值保存到主内存的变量中。 这些原子性操作必须遵守以下规则:1. 对于同一条变量,unlock操作必须发生在该变量的lock操作之后。2. 对于同一条变量,read和load、store和write必须成对出现。3. 对于同一条变量,assign操作必须发生在该变量的read和load之后。4. 规则3的逆操作必须发生,即store和write操作必须在assign操作之前。 这些规则确保了不同线程在执行过程中对共享内存的访问和操作的正确性和一致性,从而维护了JMM的内存模型。
作者其他创作
大纲/内容
CPU
flag=fase
flag=false(失效)
load加载
boolean flag=false;--->boolean flag=true;
主内存和工作内存之间交互协议
flag=false --> true
use使用
1. 假设有两个线程操作共享内存的flag变量,默认flag变量状态是false,当第一个线程读取共享变量时,它会在内存模型操作如下原子操作:①. 从主内存中读取flag数据②. 将读取的数据加载到工作内存中③. 将工作内存副本变量加载到线程传递给执行引擎。2. 当另外一个线程2操作变量时,如果加了volatile变量,则会如下操作①. 首先将执行引擎中变量值写回到工作内存中②. 将工作内存中的变量值读取出来,进过总线的缓存一致性协议。③. 将工作内存值放入到主内存中④. 其他线程通过嗅探机制嗅探到当前变量已经进行了变更则会进行快速失效策略,当下次在读取时会再去从主内存中读取一次数据
缓存一致性协议(MESI)
嗅探机制
缓存一致性协议思想:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。https://www.scss.tcd.ie/Jeremy.Jones/vivio/caches/MESI.htm
read读
线程2
read读取
flag=true
store
assign赋值
主内存
flag
工作内存副本
线程1
flag=false
write写入
0 条评论
回复 删除
下一页