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. LeetCode 1.两数之和(JS)

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  2. YTU 2864: 分跑道。

    2864: 分跑道. 时间限制: 1 Sec  内存限制: 128 MB 提交: 23  解决: 19 题目描述 有N个人参加100米短跑比赛.跑道为8条.程序的任务是按照尽量使每组的人数相差最少的原 ...

  3. asp.net MVC 使用Bootstrap 分页

    Boostrap分页控件比较美观, 控制器代码:使用仓储模式实现.如果是直接使用DbContext上下文使用更简单. public ActionResult Index(int? page,strin ...

  4. C#中遍历ArrayList的三种方法(转)

    using System; using System.Collections; using System.Linq; using System.Text; namespace ArrayListDem ...

  5. bzoj 4519: [Cqoi2016]不同的最小割【最小割树Gomory–Hu tree】

    算法详见:http://www.cnblogs.com/lokiii/p/8191573.html 求出点两两之间的最小割之后,把他们扔到map/set里跑即可 可怕的是map和set跑的时间竟然完全 ...

  6. bzoj 2127 happiness【最小割+dinic】

    参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...

  7. bzoj 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头【瞎搞】

    某种意义上真毒瘤?我没看懂题啊...于是看了题解 就是筛约数的那种方法,复杂度调和级数保证O(nlogn) 所以这题啥意思啊 #include<iostream> #include< ...

  8. 洛谷P4374 [USACO18OPEN]Disruption(树链剖分+线段树)

    传送门 不难发现,每一条额外修的路径,会对原树上$(u,v)$路径上的所有边产生贡献 于是这就变成了一个路径修改 那么我们把每一条边赋值到它连接的两个点中深度较大的那个上面,然后每一次用树剖+线段树做 ...

  9. 【API】反转输入字符(Java)

    请求输入字符, 输出反转. import java.util.Scanner; public class T01 { public static void main(String[] args) { ...

  10. QB学堂济南游记

    七天很快就过去了,今天的测试意味着集训也将结束.回首七天来,与许多dalao同处一室,见识到了各种厉害的老师.厉害的算法.厉害的数据结构. 前两天jzh与yl老师讲课的时候还是全程在线,然而讲到数据结 ...