美文网首页
Volatile关键字如何保证内存可见性

Volatile关键字如何保证内存可见性

作者: breaktian | 来源:发表于2018-05-16 16:11 被阅读163次

主线程对其某个字段所做的变更对新创建出来的线程不可见。造成这种现象的首要原因是,JIT编译器可能对新线程代码里的while循环进行了优化,并因此导致新线程在线程上下文中无法看到变量的变化。此外,新线程可能会只从其寄存器或本地cache中读取标记变量的值,而不是每次都跑去速度更慢的内存里进行操作。基于上述原因,新线程就无法看到主线程对其标记变量值的变更了,
如果想要快速修复此问题,只需要将变量done标记为volatile就可以了。
关键字volatile的作用是告知JIT编译器不要对被标记变量执行任何可能影响其访问顺序的优化。该关键字警告JIT编译器,该变量可能会被某个线程更改,所以任何对该变量的读写访问都需要忽略本地cache并直接对内存进行操作。之前我将这个改动称为快速修复,是因为如果我们将所有变量都标记为volatile的话,虽然可以完全规避此类问题,但却会使每次变量访问都要跨越内存栅栏并最终导致程序性能下降。此外,在多个字段被多个线程并发访问的场景下,由于针对每个volatile字段的访问都是各自独立处理的,并且也无法将这些访问统一协调成一次访问,所以volatile关键字无法保证整体操作的原子性。该问题所造成的后果是,线程很可能对某些字段只能看到其中间结果,而对另一些变量则看到的是最终的变更结果。
总结:

  1. volatile关键字修饰的字段会保证内存可见
  2. volatile关键字修饰的字段不会进行指令重排

相关文章

  • volatile

    目标 1、volatile如何保证内存可见性2、volatile如何禁止指令重排序3、内存屏障4、内存可见性5、关...

  • Java-volatile的作用

    参考来源 java volatile关键字解惑 使用volatie的场景 如何保证内存的可见性 在java虚拟机的...

  • 深入浅出 Java 并发编程 (2)

    本文目录 Java 内存模型与可见性 指令重排序 使用 volatile 关键字保证可见性 使用 synchron...

  • 深入理解Java多线程中的volatile关键字

    Java 的 volatile关键字对可见性的保证 Java 的 volatile关键字在保证可见性之前的所做的事...

  • volatile什么时候使用

    volatile关键字 我们都知道volatile修饰的变量,保证了数据内存的可见性。 强迫每个线程在读取vola...

  • volatile关键字总结

    volatile保证了线程安全的可见性,是由jvm提供的机制。 java内存模型对volatile关键字定义的特殊...

  • Java并发基础

    volatile关键字 保证共享变量的可见性 使用Lock指令保证可见性a.引起处理器缓存回写到内存b.处理器缓存...

  • 小编带您Volatile的详解

    volatile关键字修饰的共享变量主要有两个特点:1.保证了不同线程访问的内存可见性 2.禁止重排序 在说内存可...

  • volatile

    对于可见性,Java提供了volatile关键字来保证可见性。 当一个共享变量被volatile修饰时,它会保证修...

  • volatile关键字

    对volatile关键字的总结:volatile用来保证该变量对所有线程的可见性(从主内存加载到工作线程的值是最新...

网友评论

      本文标题:Volatile关键字如何保证内存可见性

      本文链接:https://www.haomeiwen.com/subject/zyapdftx.html