WEB开发网
开发学院软件开发Java 多线程基础总结三--volatile 阅读

多线程基础总结三--volatile

 2010-01-22 00:00:00 来源:WEB开发网   
核心提示: 由于其无法保证“读-修改-写”这样操作的原子性(当然java.util.concurrent.atomic包内的实现满足这些操作,主要是通过 CAS--比较交换的机制,多线程基础总结三--volatile(2),后续会尝试写写,),不能得到保证,所以使用synchroni

由于其无法保证“读-修改-写”这样操作的原子性(当然java.util.concurrent.atomic包内的实现满足这些操作,主要是通过 CAS--比较交换的机制,后续会尝试写写。),所以像++,--,+=,-=这样的变量操作,即使声明volatile也不会保证正确性。围绕这个原理的主题,我们可以大致的整理一下volatile代替synchronized的条件:对变量的写操作不依赖自身的状态。所以除了刚刚介绍的操作外,例如:

Java代码

private volatile boolean flag; 
 if(!flag) { 
  flag == true; 
}

类似这样的操作也是违反volatile使用条件的,很可能造成程序的问题。所以使用volatile的简单场景是一次性的写入之后,大量线程的读取并且不再改变变量的值(如果这样的话,都不是并发了)。这个关键字的优势还是在于多线程的读取,既保证了读取的低开销(与单线程程序变量差不多),又能保证读到的是最新的值。所以利用这个优势我们可以结合synchronized使用实现低开销读写锁:

Java代码

/** 
 * User: yanxuxin 
 * Date: Dec 12, 2009 
 * Time: 8:28:29 PM 
 */ 
public class AnotherSyncSample { 
  private volatile int counter; 
 
  public int getCounter() { 
 return counter; 
  } 
 
  public synchronized void add() { 
    counter++; 
  } 
}

这个简单的例子在读的方法上没有使用synchronized关键字,所以读的操作几乎没有等待;而由于写的操作是原子性的违反了使用条件,不能得到保证,所以使用synchronized同步得到写的正确性保证,这个模型在多读取少写入的实际场景中应该要比都用synchronized的性能有不小的提升。

Tags:线程 基础 总结

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接