Atomic reference vs volatile reference

volatile reference和atomic reference的作用有何不同?
通过查阅AtomicReference的代码发现,它内部是基于volatile的field来存储reference。所以,它具备volatile的功能。如果,只是想解决“可见性”,直接用AtomicReference的get和set方法就相当于volatile的作用。但是,volatile无法保证多个线程写入不相互覆盖的问题。

怎么解决呢?加锁。这个谁都知道。不加锁呢?就可以用AtomicReference提供的CAS方法compareAndSet(expected,actual)。如果volatile域的值等于expected那么就用actual去更新然后返回true,否则返回false。

所以,常见的变成模式是用一个循环(比如volatile域是数组):
private AtomicReference<int[]>items=new AtomicReference();
public void add(int item){
  int[] copy = items.get(); // get copy
  while(true) {
    int[] updated=Arrays.copyOf(copy,copy.length+1);
    updated[updated.length-1]=item;
    if(items.compareAndSet(copy,updated)){
      return;
    }  
  }
}

猜你喜欢

转载自messi-18.iteye.com/blog/2265342
今日推荐