Java NIO - volatile

1,volatile 相当于synchronized弱实现,volatile关键字实现了类似synchronized的语义,却没有实现锁机制。

 volatile关键字确保字段的更新已可预见的方式告诉其他线程。

-1,Java存储模型不会对valatile关键字修饰的字段重排序,这个保证volatile关键字修饰的变量操作时会按指令出现的先后顺序执行。

-2,volatile关键字不会被缓存到寄存器或其他对CPU不可见的地方,每次总是从主存中读取volatile变量的结果。也就是对volatile变量的修改,对其他线程总是可见的,并且不是使用线程自己的栈来存储。

volatile只能保证可见性,但不保证线程安全性。

2,使用

volatile关键字使用场景满足以下条件:

  • 对变量的写操作不依赖于当前值。

  • 该变量状态不需要与其他变量共同参与不变约束。

  • 访问该变量不需要加锁。

3,错误场景使用volatile

   
   
   
   
  1. public class NumberRange {
  2. private int lower;
  3. private int upper;
  4. public int getLower() {
  5. return lower;
  6. }
  7. public void setLower(int value) {
  8. if (value > upper)
  9. throw new IllegalArgumentException("value > upper");
  10. lower = value;
  11. }
  12. public int getUpper() {
  13. return upper;
  14. }
  15. public void setUpper(int value) {
  16. if (value < lower)
  17. throw new IllegalArgumentException("value < lower");
  18. upper = value;
  19. }

在以上场景中,初始化lower=0,upper=5,A、B两个线程分别回去最小、最大值,分别设置upper=4,lower=2。程序将抛出异常,再次场景中不能使用volatile关键字来实现。

4,volatile的使用场景。

  • 状态标识,volatile仅仅作为一个变量标识,在发生一个重要事件后进行修改,其他只是作为一个只读标识。

   
   
   
   
  1. public class ShutdownRequested {
  2. volatile boolean shutDown = false;
  3. public void shutDown(){
  4. shutDown = true;
  5. }
  6. public void work(){
  7. while(!shutDown){
  8. //do work
  9. }
  10. }
  11. }



参考:

http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

http://www.blogjava.net/xylz/archive/2010/07/03/325168.html




 

你可能感兴趣的:(volatile,nio)