这是Java中AtomicReference的正确用例吗?

时间:2015-06-04 18:52:26

标签: java multithreading atomicity

我有一个处理器缓存类,它是一个单例,并且有一个Processor字段。 Processor字段将由单个Updating线程设置,并由许多Worker个线程使用。

我不知道我当前的实现是否适用于AtomicReference。请你检查并纠正它吗?另外,在这种情况下,我可以使用volatile代替AtomicReference吗?

实施:

class Cache {
    private AtomicReference<Processor> processor;

    public static getInstance() { ... }

    public Processor getProcessor() {
        return processor.get();
    }

    public void setProcessor(Processor old, Processor new) {
        processor.compareAndSet(old, new);
    }
}

/* Only one thread will update the processor cache */
class UpdatingThread {
    private Processor oldProcessor;

    public void run() {
        // some logic
        Processor newProcessor = createNewProcessor();
        Cache.getInstance().setProcessor(oldProcessor, newProcessor);
        oldProcessor = newProcessor;
        // some more logic
    }
}

/* Multiple workers will use the processor */
class WorderThread {
    public void run() {
        // some logic
        Processor processor = Cache.getInstance().getProcessor();
        // more logic using the processor
    }
}

1 个答案:

答案 0 :(得分:3)

由于您实际做的唯一事情是重新分配processor类中的Cache字段,因此volatile字段更适合。您不使用AtomicReference提供的额外功能。

此外,如果你想使用AtomReference,你应该使用set方法,这样就不必跟踪oldProcessor