AtomicIntegerFieldUpdater 介绍

多线程开发的时候,如果一个类是自己编写的,则可以在编写的时候把成员变量定义为 Atomicxxx 类型。但如果是一个已经有的类,在不能更改其源代码的情况下,要想实现对其成员变量的原子操作,就需要 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater 和 AtomicReferenceFieldUpdater。

使用示例

两个线程对 test 对象的 volatile 变量,分别进行加和减操作。

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

public class Test {
    public volatile int num;
    private AtomicIntegerFieldUpdater<Test> updater = AtomicIntegerFieldUpdater
                                                     .newUpdater(Test.class, "num");

    public static void main(String[] args) throws Exception{
        Test test = new Test();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100000; i++) {
                    test.updater.incrementAndGet(test);
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100000; i++) {
                    test.updater.decrementAndGet(test);
                }
            }
        });
        thread1.start();
        thread2.start();
        Thread.sleep(10 * 1000);
        System.out.println("查看num的值,num=" + test.num); 
    }
}

结果:
查看num的值,num=0

相关文章: