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关键字并不能保证原子性。
---------------------

Java并发——volatile关键字的使用的更多相关文章

  1. Java 并发 —— volatile 关键字

    volatile 修饰变量等于向编译器传达如下两层含义: 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的. 禁止进行指令重排序. volat ...

  2. Java并发--volatile关键字

    一.volatile的实现原理 synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁,而volatile就可以说是JVM提供的最轻量级的同步机制.JMM告诉我们,各个线程会将共 ...

  3. Java并发——volatile关键字

    什么是内存可见性? 这里就要提一下JMM(Java内存模型).当线程在运行的时候,并不是直接直接修改电脑主内存中的变量的值.线程间通讯也不是直接把一个线程的变量的值传给另一个线程,让其刷新变量.下面是 ...

  4. 【转】java中volatile关键字的含义

    java中volatile关键字的含义   在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

  5. 转:java中volatile关键字的含义

    转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

  6. java 并发——volatile

    java 并发--volatile 介绍 维基百科: volatile 是一个类型修饰符(type specifier).volatile 的作用是确保本条指令不会因编译器的优化而省略,且要求每次直接 ...

  7. Java并发-volatile的原理及用法

    Java并发-volatile的原理及用法 volatile属性:可见性.保证有序性.不保证原子性.一.volatile可见性 在Java的内存中所有的变量都存在主内存中,每个线程有单独CPU缓存内存 ...

  8. Java并发——volatile的原理

    111 Java并发——volatile的原理

  9. Java中Volatile关键字详解 (转自郑州的文武)

    java中volatile关键字的含义:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 一.基本概念 先补充一下概念:J ...

随机推荐

  1. (22) java web的struts2框架的使用-struts配置文件

    1,配置文件的引用 struts中配置文件可以有多个,每个模块的包里面都可以单独设立一个struts配置文件. 主的配置文件,放在“src”文件夹下,可以引入其他配置文件,引入方式: <!-- ...

  2. 织梦首页TAG标签页的仿制

    1,tag标签的作用:主要是为了能够使得用户可以更加精确的找寻到自己所需内容.这种TAG搜索方式,比分类搜索更加的精确.具体以及节省时间. 2,怎么能够合理的优化TAG标签? A:明白网站的TAG标签 ...

  3. 简单的处理git add ,git commit,git push 脚本

    创建脚本lazygit.sh #!/bin/bash # 一次性处理git提交 #branch_name=`git symbolic-ref --short -q HEAD` branch_name= ...

  4. Linux网络协议栈(二)——套接字缓存(socket buffer)

    Linux网络核心数据结构是套接字缓存(socket buffer),简称skb.它代表一个要发送或处理的报文,并贯穿于整个协议栈.1.    套接字缓存skb由两部分组成:(1)    报文数据:它 ...

  5. python的termcolor模块

    termcolor是一个python包,可以改变控制台输出的颜色,支持各种terminal(WINDOWS的cmd.exe除外). 它支持下列的文字颜色: grey, red, green, yell ...

  6. linux修改用户主目录的方法 (转载)

    转自:http://xiaomaimai.blog.51cto.com/1182965/274002 第一:修改/etc/passwd文件第二:usermod命令 详细说明如下:第一种方法:vi /e ...

  7. Windows API函数大全

    WindowsAPI函数大全(精心总结) 目录 1. API之网络函数... 1 2. API之消息函数... 1 3. API之文件处理函数... 2 4. API之打印函数... 5 5. API ...

  8. [POI2007]洪水pow

    Description AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD市的市长,召集了他的所有顾问(包括你)参加一个紧急会议.经过细致的商 ...

  9. magento 用程序生成优惠劵码

    参考自http://fragmentedthought.com/fragments/programatically-creating-sales-rule-coupon-code 上面的代码只能生成C ...

  10. Linux环境下HDFS集群环境搭建关键步骤

    Linux环境下HDFS集群环境搭建关键步骤记录. 介质版本:hadoop-2.7.3.tar.gz 节点数量:3节点. 一.下载安装介质 官网下载地址:http://hadoop.apache.or ...