zoukankan      html  css  js  c++  java
  • Java并发——volatile关键字的使用

    volatile关键字的使用
    volatile关键字
    原理
    适合使用volatile关键字的情况
    当且仅当满足以下所有条件时,才==应该==使用volatile关键字:
    volatile关键字的作用
    volatile关键字
    volatile关键字所修饰的变量即volatile变量,这是Java所提供的一种稍弱的同步机制,用于确保对volatile变量的更新能够通知到其他的线程。

    原理
    要理解volatile关键字的原理,需要先了解Java内存模型(JMM),在这里不做展开。对变量采用volatile关键字进行修饰,可以使得改变量具备以下两种特性:

    变量可见性 ,某一线程对volatile变量的修改,其他线程将能够立即可见;
    即volatile变量不会被缓存在线程的工作空间或者别的对处理器不可见的地方,对volatile变量的修改会立即同步到主内存中。(JMM先行发生原则之一:volatile规则——对volatile变量的写操作先行发生于后面对这个变量的读操作。)
    有序性 volatile关键字通过增加内存屏障的方式来限制指令重排,因此编译器与JVM不会将对volatile变量的操作与其他内存操作一起重排序;
    适合使用volatile关键字的情况
    volatile变量通常用于做某个操作完成、发生中断或者其他状态表示的标志,例如用在检查某个状态标记以判断是否退出循环的情况下。
    1
    当且仅当满足以下所有条件时,才应该使用volatile关键字:
    1、对变量的写入操作不依赖于变量的当前值,或者你能确保只有单个线程能够更新变量的值。
    2、该变量不会与其他状态变量一起纳入不变性条件中
    3、在访问变量时不需要加锁。
    1
    2
    3
    volatile关键字的作用
    volatile关键字对可见性的影响比volatile变量本身更加重要,volatile关键字不仅仅影响所修饰的变量的可见性。当线程A写入一个volatile变量,线程B稍后去读取该volatile变量时,在写入volatile变量之前对线程A可见的所有变量的值,在B读取了volatile变量之后,都对线程B可见(内存屏障)。

    volatile关键字并不能保证原子性。
    --------------------- 

  • 相关阅读:
    修复PLSQL Developer 与 Office 2010的集成导出Excel 功能
    Using svn in CLI with Batch
    mysql 备份数据库 mysqldump
    Red Hat 5.8 CentOS 6.5 共用 输入法
    HP 4411s Install Red Hat Enterprise Linux 5.8) Wireless Driver
    变更RHEL(Red Hat Enterprise Linux 5.8)更新源使之自动更新
    RedHat 5.6 问题简记
    Weblogic 9.2和10.3 改密码 一站完成
    ExtJS Tab里放Grid高度自适应问题,官方Perfect方案。
    文件和目录之utime函数
  • 原文地址:https://www.cnblogs.com/hyhy904/p/10942245.html
Copyright © 2011-2022 走看看