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,如下所示:
当需要原子性的扩容时,只需要进行如下操作:
场景2示例:假设我们正在设计并发的LinkedList,node中需要原子变量指向下个node。一种方案是每个node中包含AtomicReference:
另一种方案是使用static AtomicReferenceFieldUpdater, 所有node实例共享一个updater实例,如下所示:
使用场景:
场景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; ... }
相关文章推荐
- Why And When To Use Pre-Update and Pre-Insert Triggers In Oracle Forms
- When to use comparable and comparator interfaces in java
- how to save a c++ object in java object and use it
- The Atomic classes in Java 5: AtomicInteger and AtomicLong,AtomicReference etc.
- When to use next() and return next() in Node.js
- When to use static method in a java class
- Know How And When To Use System.Message_Level To Control Messages In Oracle Forms
- (Page 1 of 3 )A walking tour of JavaBeans What JavaBeans is, how it works, and why you want to use it
- (Page 2 of 3 )A walking tour of JavaBeans 2 :What JavaBeans is, how it works, and why you want to use it
- Java并发学习(九)-AtomicIntegerFieldUpdater字段原子更新类
- (Page 3 of 3 )A walking tour of JavaBeans What JavaBeans is, how it works, and why you want to use it
- How and Why to use the System.servicemodel.MessageParameterAttribute in WCF
- How to use Comparator and Comparable in Java? With example
- When to use LinkedList and When to use ArrayList- An answer in StackOverFlow
- How to use equals( ) and equalsIgnoreCase( ) in Java
- Why I can't use non-string key in the myMap[myKey] expression? And what to do now?
- The XML Litmus Test Understanding When and Why to Use XML
- How to use ConcurrentHashMap in Java - Example Tutorial and Working
- use noscript html tag when user disable the javascript in browser, guide user how to enable the js in different browser and retu
- java多线程系类:JUC原子类:05之AtomicIntegerFieldUpdater原子类