zoukankan      html  css  js  c++  java
  • Java的Volatile关键字

    Java 的 volatile 关键字是用来标记 Java 变量是“存储在内存中的”。更精确的说,读取 volatile 变量时,会从内存中读取,而不是从 CPU 缓存中读取。写入 volatile 变量的值时,会写入到内存中去,而不是写入 CPU 缓存中。

    volatile 可以保证可见性

    volatile 可以保证变量变化跨线程的可见性。
    在多线程应用中,因为性能的原因,线程可能会直接从 CPU 缓存中读取变量的值,而现在的电脑有不止一个 CPU,所以读到的变量的值可能是错的。如果是用 volatile 标记变量,可以保证每次读取变量的值都是从内存中读取,每次写入变脸的值,都会写入到内存中去。

    volatile 的 Happens-Before 保证

    • 如果线程 A 写入了一个 volatile 变量的值,然后线程 B 去读取这个变量的值。那么在线程 A 中,在写入 volatile 的值之前的其他所有变量,对线程 B 都可见。(因为写入 volatile 变量是,会把 CPU 缓存中的值都写入到内存中去)
    • 由于性能的原因,JVM 可能会对代码执行进行重排序,但是这样造成的结果可能不是我们想要的。volatile 可以保证所有跟随在读或写 volatile 变量之后的指令不允许重排序,都会发生在读或写 volatile 变量之后。

    只有 volatile 是不够的

    如果多线程写入新值到共享的 volatile 变量中去时,有可能会出现竞态。

    那么可以怎么做?

    使用 synchronize 关键字

    volatile 的性能

    • 内存的速度比 CPU 缓存的速度慢
    • volatile 不允许指令重排序

    这两个原因造成 volatile 的性能不是很高。所以只有你需要使用 volatile 的时候才去使用它。

  • 相关阅读:
    nginx-rtmp-module搭建流媒体服务器
    rabbitmq安装
    opencv+python (3)
    linux命令
    mysql语句概览
    BUUCTF V&N-misc内存取证
    2018 HEBTUCTF 部分misc
    2020 安恒2月月赛 misc
    2018.6.1 铁三数据赛 复现
    2020 i春秋新春战疫公益赛 misc
  • 原文地址:https://www.cnblogs.com/okadanana/p/5940379.html
Copyright © 2011-2022 走看看