Cache、CPU 缓存一致性、MESI 协议、java volatile 关键字

一、计算机的存储金字塔

二、CPU 三级缓存

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

MESI 协议就是 CPU 缓存一致性的一种实现方式

四、volatile 关键字

注意,这里的 volatile 关键字指的是 java 的 volatile,而不是 C++ 的 volatile,这两者之间在语义和作用上存在显著差异。

在 Java 中,volatile 关键字主要用于解决多线程环境下的可见性(Visibility)和指令重排(Instruction Reordering)问题。

  1. 可见性保证 (Visibility Guarantee):
    • 当一个变量被声明为 volatile 时,对该变量的写操作会立即被其他线程看到。换句话说,当一个线程修改了 volatile 变量的值,这个新值对所有其他线程来说都是立即可见的。
    • 它强制保证了对 volatile 变量的读写操作都会直接与主内存进行同步,而不是仅仅在线程的本地缓存中操作。
    • 比喻: 想象一个公告板,volatile 变量就是公告板上的内容。任何线程写完,都会立即更新到公告板上,所有其他线程都能立即看到最新内容。
  2. 有序性保证 (Ordering Guarantee / Happens-Before Relationship):
    • volatile 不仅保证了可见性,还提供了部分有序性保证,防止指令重排。
    • 写操作:volatile 变量的写操作,happens-before 于后续对同一个 volatile 变量的读操作。这意味着,在写入 volatile 变量之前的任何操作,都会在该写操作完成并对其他线程可见之后,才会被其他线程看到。
    • 读操作:volatile 变量的读操作,happens-after 于之前对同一个 volatile 变量的写操作。这意味着,在读取 volatile 变量之后的任何操作,都会在该读操作完成并确保读到了最新值之后才执行。
    • 比喻: volatile 写就像一个“内存屏障”,它会把写操作之前的所有操作“推”到内存中,并且保证这些操作在 volatile 写之后的所有操作之前完成。volatile 读则会把读操作之后的所有操作“拉”到内存中,并且保证这些操作在 volatile 读之后的所有操作之前完成。

总结 Java volatile 它是JVM层面提供的一种轻量级同步机制,主要用于保证共享变量的可见性和防止特定类型的指令重排,但不提供原子性(对于复合操作,如 i++ 仍然需要 synchronizedAtomic 类)。

五、伪共享问题

posted @ 2025-06-05 22:45  光風霽月  阅读(6)  评论(0)    收藏  举报