JMM

- Java JVM

1:基本操作流程(单线程)

sequenceDiagram participant 主内存 participant 工作内存 participant 线程 Note over 主内存,工作内存: 读取变量(主内存 → 工作内存) 线程 ->> 主内存: read(var) 主内存 -->> 工作内存: 传输变量值 线程 ->> 工作内存: load(var) Note over 工作内存: 修改变量(工作内存内操作) 线程 ->> 工作内存: assign(var, newValue) Note over 工作内存,主内存: 写回变量(工作内存 → 主内存) 线程 ->> 工作内存: store(var) 工作内存 -->> 主内存: 传输变量值 线程 ->> 主内存: write(var)

2:多线程下的原子性问题

sequenceDiagram participant 主内存 participant 工作内存A participant 线程A participant 工作内存B participant 线程B rect rgba(255, 0, 0, 0.1) Note left of 线程A: 线程A操作 线程A ->> 主内存: read(var) 主内存 -->> 工作内存A: var=0 线程A ->> 工作内存A: load(var) 线程A ->> 工作内存A: assign(var, 1) 线程A ->> 工作内存A: store(var) 工作内存A -->> 主内存: 准备写入var=1 end rect rgba(0, 255, 0, 0.1) Note right of 线程B: 线程B操作(插入A的store→write之间) 线程B ->> 主内存: read(var)(主内存仍为0) 主内存 -->> 工作内存B: var=0 线程B ->> 工作内存B: load(var) 线程B ->> 工作内存B: assign(var, 1) 线程B ->> 工作内存B: store(var) 工作内存B -->> 主内存: 写入var=1 主内存 -->> 线程B: write(var)完成 end rect rgba(255, 0, 0, 0.1) Note left of 线程A: 线程A完成写入(被覆盖) 主内存 -->> 线程A: write(var)(最终var=1,预期为2) end

3:同步机制下的原子性保证(如volatile)

sequenceDiagram participant 主内存 participant 工作内存A participant 线程A participant 工作内存B participant 线程B rect rgba(0, 255, 0, 0.1) Note left of 线程A: 线程A操作(volatile变量) 线程A ->> 主内存: read(var) 主内存 -->> 工作内存A: var=0 线程A ->> 工作内存A: load(var) 线程A ->> 工作内存A: assign(var, 1) 线程A ->> 工作内存A: store(var) 工作内存A -->> 主内存: 立即写入var=1 主内存 -->> 线程A: write(var)完成 end rect rgba(0, 0, 255, 0.1) Note right of 线程B: 线程B操作(强制读取最新值) 线程B ->> 主内存: read(var)(必须读取var=1) 主内存 -->> 工作内存B: var=1 线程B ->> 工作内存B: load(var) end

‌关键说明‌

  1. ‌基本流程‌:
  1. ‌多线程原子性问题‌:
  1. 同步机制作用‌: