Java NIO - volatile
2016-04-03 14:50
405 查看
1,volatile 相当于synchronized弱实现,volatile关键字实现了类似synchronized的语义,却没有实现锁机制。
volatile关键字确保字段的更新已可预见的方式告诉其他线程。
-1,Java存储模型不会对valatile关键字修饰的字段重排序,这个保证volatile关键字修饰的变量操作时会按指令出现的先后顺序执行。
-2,volatile关键字不会被缓存到寄存器或其他对CPU不可见的地方,每次总是从主存中读取volatile变量的结果。也就是对volatile变量的修改,对其他线程总是可见的,并且不是使用线程自己的栈来存储。
volatile只能保证可见性,但不保证线程安全性。
2,使用
volatile关键字使用场景满足以下条件:
对变量的写操作不依赖于当前值。
该变量状态不需要与其他变量共同参与不变约束。
访问该变量不需要加锁。
3,错误场景使用volatile
在以上场景中,初始化lower=0,upper=5,A、B两个线程分别回去最小、最大值,分别设置upper=4,lower=2。程序将抛出异常,再次场景中不能使用volatile关键字来实现。
4,volatile的使用场景。
状态标识,volatile仅仅作为一个变量标识,在发生一个重要事件后进行修改,其他只是作为一个只读标识。
参考:
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html http://www.blogjava.net/xylz/archive/2010/07/03/325168.html
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
相关文章推荐
- spymemcached源码中Reactor模式分析
- Java IO与NIO的一些文件拷贝测试
- C中的volatile使用方法
- 探讨C语言中关键字volatile的含义
- Java NIO工作原理的全面分析
- 学习Java多线程之volatile域
- C语言中auto,register,static,const,volatile的区别详细解析
- C语言中const,volatile,restrict的用法总结
- C语言 volatile与const同时使用应注意的问题
- 深入解析Java中volatile关键字的作用
- 解析java中volatile关键字
- 深度解析Java中volatile的内存语义实现以及运用场景
- 谈谈Java中Volatile关键字的理解
- 详解Java线程编程中的volatile关键字的作用
- java的nio的使用示例分享
- Java NIO和IO的区别
- 深入探讨Java多线程中的volatile变量
- 深入讲解C语言编程中volatile修饰符的作用
- Java理论与实践:正确使用volatile 变量
- 一个由JIT优化引发的问题