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. 20170111 ABAP技术小结(全半角转换)

    DATA: it_po LIKE it_alv OCCURS 0 WITH HEADER LINE.************************************************** ...

  2. Ubuntu 12.10安装vmware-tools

    1:[菜单]->[虚拟机]->[重新安装vmware tools]出现 图中下边说的很清楚,解压然后执行 2:把压缩包拷贝到 /home/下,然后执行 :tar -zxvf v[按住tab ...

  3. (unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误

    一个困扰我两天的问题, Google和Baidu没有找到解决方法! 此文为记录这个问题,并给出原因和解决方法. 1.Unix domain socket简介 unix域协议并不是一个实际的协议族,而是 ...

  4. python名片管理系统

    1.代码: (1)主程序 #!/usr/bin/env python # -*- coding: UTF-8 -*- import cards_tools # 无限循环,由用户主动决定什么时候退出循环 ...

  5. win7下IIS7.0虚拟目录不存在的问题

    问题:在IIS7.0下选中虚拟目录,右边浏览应用程序下,自动打开浏览器找开虚拟目录下的网站,但过一会什么都没有改变,再一次右边浏览应用程序,就提示 “虚拟目录不存在”. 解决方法:右键网站或下面的虚拟 ...

  6. Java多线程系列八——volatile和ThreadLocal

    参考资料: http://ifeve.com/java-memory-model-4/ http://www.infoq.com/cn/articles/java-memory-model-1 htt ...

  7. 2 socket相关概念

    嘿嘿 这只是学习过程中的笔记积累,百度也是一代吧,大神就勿喷勒..... 1 为什么把网络编程接口叫做套接字 socket字面意思为插座 插孔,让人联想到电话,这种简单的设备给人类太大的方便 2 根据 ...

  8. [POI2008]KUP

    Description 给一个\(n\times n\)的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个\(n\times ...

  9. ACM二分查找模板

    int main(){ == key int m; while ( l <= r ) { m = ( l + r ) >> 1; if ( x[m] == key ) return ...

  10. BFS(最短路) HDOJ 4308 Saving Princess claire_

    题目传送门 题意:一个(r*c<=5000)的迷宫,起点'Y‘,终点'C',陷阱‘#’,可行路‘*’(每走一个,*cost),传送门P,问Y到C的最短路 分析:一道最短路问题,加了传送门的功能, ...