知识卡片

缓存带来可见性

普通读书笔记卡 · 1518

内容

多核 CPU 为弥补内核和主存的速度差,引入 L1/L2/L3 多级高速缓存(越靠近 CPU 越快越小),让一个核心写入的数据不会立刻被另一核心看到。JMM 再加一层抽象:变量存放公共主存,线程操作时先复制到私有工作内存,回刷时机不固定——这是可见性问题的成因,是硬件缓存与 JMM 抽象共同带来的,需 volatile 等手段显式保证跨线程可见。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第4章《可见性与有序性的原理》4.1节《CPU物理缓存结构》、4.2.2节《可见性问题》(源文件:_epub-src/OEBPS/Text/chapter122.xhtml、chapter125.xhtml) - 结论依据:原文说明CPU为提高速度设计了多层高速缓存(L1/L2/L3),L1/L2仅被单核使用、L3和主存才被共享;又给出JMM的定义——变量存放公共主存,线程操作的是复制到私有工作内存的副本——并用线程A/B并发自增sum、线程A的修改未及时回刷导致线程B读到旧值的例子说明可见性问题,因此推出本卡结论。 - 原始内容:L1高速缓存和L2高速缓存都只能被一个单独的CPU内核使用,L3高速缓存可以被同一个CPU芯片上的所有CPU内核共享,而主存可以由系统中的所有CPU共享……JMM规定,将所有的变量都存放在公共主存中,当线程使用变量时会把主存中的变量复制到自己的工作空间(或者叫私有内存)中,线程对变量的读写操作,是自己工作内存中的变量副本。