java之volatile底层是如何实现线程之间的可见性

70 阅读1分钟

在 Java 中,volatile关键字保证线程可见性主要是通过内存屏障和缓存一致性协议来实现的,以下是具体分析:

内存屏障

  • 概念:内存屏障是一种 CPU 指令,它可以阻止指令重排序,并保证特定的内存操作顺序。
  • 作用机制:在volatile变量的写操作之前,编译器和处理器会插入一个 StoreStore 屏障,确保在该屏障之前的所有写操作都被刷新到主内存后,才会执行volatile变量的写操作。在volatile变量的读操作之后,会插入一个 LoadLoad 屏障,保证在执行volatile变量的读操作之后,后续的读操作不会被重排序到该读操作之前,确保能读取到最新值。

缓存一致性协议

  • 概念:多处理器系统中,每个处理器都有自己的高速缓存,缓存一致性协议用于确保各个处理器缓存数据的一致性。
  • 作用机制:当一个处理器修改了volatile变量的值并将其刷新到主内存时,会通过总线将这个写操作广播给其他处理器。其他处理器收到这个广播后,会将自己缓存中对应的变量数据标记为无效。当这些处理器下次再访问该变量时,由于缓存数据已无效,就会从主内存中重新读取最新的值,从而保证了volatile变量在多个线程之间的可见性。