您的位置:首页 > 编程语言 > Java开发

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

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
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NIO volatile