Java NIO - volatile
来源:互联网 发布:java 图形界面案例 编辑:程序博客网 时间:2024/06/06 03:04
1,volatile 相当于synchronized弱实现,volatile关键字实现了类似synchronized的语义,却没有实现锁机制。
volatile关键字确保字段的更新已可预见的方式告诉其他线程。
-1,Java存储模型不会对valatile关键字修饰的字段重排序,这个保证volatile关键字修饰的变量操作时会按指令出现的先后顺序执行。
-2,volatile关键字不会被缓存到寄存器或其他对CPU不可见的地方,每次总是从主存中读取volatile变量的结果。也就是对volatile变量的修改,对其他线程总是可见的,并且不是使用线程自己的栈来存储。
volatile只能保证可见性,但不保证线程安全性。
2,使用
volatile关键字使用场景满足以下条件:
对变量的写操作不依赖于当前值。
该变量状态不需要与其他变量共同参与不变约束。
访问该变量不需要加锁。
3,错误场景使用volatile
public class NumberRange {
private int lower;
private int upper;
public int getLower() {
return lower;
}
public void setLower(int value) {
if (value > upper)
throw new IllegalArgumentException("value > upper");
lower = value;
}
public int getUpper() {
return upper;
}
public void setUpper(int value) {
if (value < lower)
throw new IllegalArgumentException("value < lower");
upper = value;
}
在以上场景中,初始化lower=0,upper=5,A、B两个线程分别回去最小、最大值,分别设置upper=4,lower=2。程序将抛出异常,再次场景中不能使用volatile关键字来实现。
4,volatile的使用场景。
状态标识,volatile仅仅作为一个变量标识,在发生一个重要事件后进行修改,其他只是作为一个只读标识。
public class ShutdownRequested {
volatile boolean shutDown = false;
public void shutDown(){
shutDown = true;
}
public void work(){
while(!shutDown){
//do work
}
}
}
参考:
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
http://www.blogjava.net/xylz/archive/2010/07/03/325168.html
1 0
- Java NIO - volatile
- Java NIO: NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- NIO--JAVA NIO 入门
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- php连接MYSQL(1)
- 深度探索C++对象模型(3)
- CodeForces 15A Elephant
- 【HDU5656】CA Loves GCD——动态规划
- J2EE中Servlet实现的三种方法
- Java NIO - volatile
- CodeForces 15C Industrial Nim
- LeetCodet题解--12. Integer to Roman
- CodeForces 560CGerald's Hexagon(几何)
- 三言两语说shader(六)外发光、表面shader
- JavaWeb - 知识点
- 第六周项目三 IP地址类
- [BZOJ1067][SCOI2007]降雨量(线段树)
- ZOJ 2836Number Puzzle(容斥原理)