Cache、CPU 缓存一致性、MESI 协议、java volatile 关键字
一、计算机的存储金字塔

二、CPU 三级缓存

三、CPU 缓存一致性与 MESI 协议

MESI 协议就是 CPU 缓存一致性的一种实现方式
四、volatile 关键字

注意,这里的 volatile 关键字指的是 java 的 volatile,而不是 C++ 的 volatile,这两者之间在语义和作用上存在显著差异。
在 Java 中,volatile 关键字主要用于解决多线程环境下的可见性(Visibility)和指令重排(Instruction Reordering)问题。
- 可见性保证 (Visibility Guarantee):
- 当一个变量被声明为
volatile时,对该变量的写操作会立即被其他线程看到。换句话说,当一个线程修改了volatile变量的值,这个新值对所有其他线程来说都是立即可见的。 - 它强制保证了对
volatile变量的读写操作都会直接与主内存进行同步,而不是仅仅在线程的本地缓存中操作。 - 比喻: 想象一个公告板,
volatile变量就是公告板上的内容。任何线程写完,都会立即更新到公告板上,所有其他线程都能立即看到最新内容。
- 当一个变量被声明为
- 有序性保证 (Ordering Guarantee / Happens-Before Relationship):
volatile不仅保证了可见性,还提供了部分有序性保证,防止指令重排。- 写操作: 对
volatile变量的写操作,happens-before于后续对同一个volatile变量的读操作。这意味着,在写入volatile变量之前的任何操作,都会在该写操作完成并对其他线程可见之后,才会被其他线程看到。 - 读操作: 对
volatile变量的读操作,happens-after于之前对同一个volatile变量的写操作。这意味着,在读取volatile变量之后的任何操作,都会在该读操作完成并确保读到了最新值之后才执行。 - 比喻:
volatile写就像一个“内存屏障”,它会把写操作之前的所有操作“推”到内存中,并且保证这些操作在volatile写之后的所有操作之前完成。volatile读则会把读操作之后的所有操作“拉”到内存中,并且保证这些操作在volatile读之后的所有操作之前完成。
总结 Java volatile: 它是JVM层面提供的一种轻量级同步机制,主要用于保证共享变量的可见性和防止特定类型的指令重排,但不提供原子性(对于复合操作,如 i++ 仍然需要 synchronized 或 Atomic 类)。

浙公网安备 33010602011771号