在一个多线程环境中递增或递减一个原语类型时,使用在java.util.concurrent.atomic
包中找到的其中一个新原子类比编写自己的同步代码块要好得多。原子类确保某些操作以线程安全方式被执行,比如递增和递减一个值,更新一个值,添加一个值。原子类列表包括AtomicInteger
、AtomicBoolean
、AtomicLong
、AtomicIntegerArray
等等。
使用原子类的难题在于,所有类操作,包括 get
、set
和一系列get-set
操作是以原子态呈现的。这表示,不修改原子变量值的read
和 write
操作是同步的,不仅仅是重要的read-update-write
操作。如果您希望对同步代码的部署进行更多细粒度控制,那么解决方案就是使用一个原子的域更新器。
原子字段更新程序:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater和AtomicReferenceFieldUpdater
AtomicReferenceFieldUpdater 实例:
public class FieldUpdaterTest { //不能是static //不能使final //必须是volatile public volatile String match; public static void main(String[] args) { FieldUpdaterTest t = new FieldUpdaterTest(); t.match = "str"; AtomicReferenceFieldUpdater<FieldUpdaterTest, String> matchUpdater = AtomicReferenceFieldUpdater .newUpdater(FieldUpdaterTest.class, String.class, "match"); matchUpdater.compareAndSet(t, "str", "hello"); System.out.println(t.match); matchUpdater.compareAndSet(t, "a", "world"); System.out.println(t.match); } }
http://www.ibm.com/developerworks/cn/java/j-5things15/#ibm-pcon