Atomic Variables

java.util.concurrent.atomic包定义了支持对单个变量执行原子操作的类。所有类都有getset方法,它们的作用类似于对volatile变量的读写。也就是说,set与同一变量上的任何后续get都具有事前发生的关系。原子compareAndSet方法也具有这些内存一致性功能,适用于整数原子变量的简单原子算术方法也是如此。

要查看如何使用此包,让我们返回最初用于演示线程干扰的Counter类:

class Counter {
    private int c = 0;

    public void increment() {
        c++;
    }

    public void decrement() {
        c--;
    }

    public int value() {
        return c;
    }

}

使Counter免受线程干扰的一种方法是使其方法同步,例如SynchronizedCounter

class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }

}

对于这个简单的类,同步是可以接受的解决方案。但是对于更复杂的类,我们可能要避免不必要的同步对活动的影响。用AtomicInteger代替int字段使我们能够防止线程干扰而无需求助于同步,如AtomicCounter所示:

import java.util.concurrent.atomic.AtomicInteger;

class AtomicCounter {
    private AtomicInteger c = new AtomicInteger(0);

    public void increment() {
        c.incrementAndGet();
    }

    public void decrement() {
        c.decrementAndGet();
    }

    public int value() {
        return c.get();
    }

}
首页