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

Why and when to use AtomicIntegerFieldUpdater in java?

2017-09-12 11:19 459 查看
原文地址:http://www.javamex.com/tutorials/synchronization_concurrency_7_atomic_updaters.shtml

使用场景:

   场景1:普通变量的get/set操作大部分是非原子性操作,偶尔需要原子性操作;

   场景2:某种类型需要创建大量的实例对象,但是不想为了实现原子操作而让每个实例对象中都包含Atomic***,破坏原有语义,浪费内存空间;

举例说明:

  场景1示例: BufferedInputStream内部包含一个volatile byte[], 大部分读写操作只需要简单引用该数组即可,在一些特定场景需要原子操作,比如扩容、置null等。一种方案是使用AtomicReference 引用byte[],但这会有些麻烦;另一中方案是使用volatile byte[],再包含一个 static AtomicReferenceUpdater,如下所示:

  static AtomicReferenceFieldUpdater<BufferedInputStream, byte[]>  bufUpdater = AtomicReferenceFieldUpdater.newUpdater(BufferedInputStream.class,  byte[].class, "buf");


当需要原子性的扩容时,只需要进行如下操作:

if (bufUpdater.compareAndSet(this, oldBuffer, newBuffer)) {
...
}


  场景2示例:假设我们正在设计并发的LinkedList,node中需要原子变量指向下个node。一种方案是每个node中包含AtomicReference:

 public class Node<T> {
private AtomicReference<Node<T>> next;
private T val;
...
}


另一种方案是使用static AtomicReferenceFieldUpdater, 所有node实例共享一个updater实例,如下所示:

public class Node<T> {
private volatile Node<T> next;
private T val;
...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐