zoukankan      html  css  js  c++  java
  • Java中的volatile关键字详解

    volatile的作用及原理

    当一个变量被volatile修饰时,会拥有两个特性:

    1. 保证了不同线程对该变量操作的内存可见性.(当一个线程修改了变量,其他使用次变量的线程可以立即知道这一修改).
    2. 禁止了指令重排序.

    1. 保证内存可见性

      JMM操作变量的时候不是直接在主存进行操作的,而是每个线程拥有自己的工作内存,在使用前,将该变量的值copy一份到自己的工作内存,读取时直接读取自己的工作内存中的值.写入操作时,先将修改后的值写入到自己的工作内存,再讲工作内存中的值刷新回主存。

    2.禁止指令重排序

      JVM在不影响单线程执行结果的情况下回对指令进行重排序,比如:

    int i = 1;//(1)
    int j = 2;//(2)
    int h = i * j;//(3)

       上述代码中,(3)执行依赖于(1)(2)的执行,但是(1)(2)的执行顺序并不影响结果,也就是说当我们进行了上述的编码,JVM真正执行的可能是(1)(2)(3),也可能是(2)(1)(3).

    这在单线程中是无所谓的,还会带来性能的提升。

    volatile的使用场景

    使用volatile修饰的变量最好满足以下条件:

    1. 对变量的写操作不依赖于当前值
    2. 该变量没有包含在具有其他变量的不变式中

    这里举几个比较经典的场景:

    1. 状态标记量,就是前面例子中的使用.
    2. 一次性安全发布.双重检查锁定问题(单例模式的双重检查).
    3. 独立观察.如果系统需要使用最后登录的人员的名字,这个场景就很适合.
    4. 开销较低的“读-写锁”策略.当读操作远远大于写操作,可以结合使用锁和volatile来提升性能
  • 相关阅读:
    restFul接口设计规范[仅供参考]
    Vue的router路由跳转传参——实现跳转时url不显示参数
    vue-cli(vue脚手架)搭建超详细教程
    Vue面试常见问题
    Ubuntu18.04安装时的一些问题
    仿BBS项目
    前端常用正则校验
    orm数据库查询优化及数据库三大设计范式总结
    SpringBoot+Git+Jenkins+Docker实现CI/CD
    Jenkins Pipeline+Maven+Gitlab持续集成构建问题集锦
  • 原文地址:https://www.cnblogs.com/songgj/p/14407465.html
Copyright © 2011-2022 走看看