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

标签 java multithreading atomic

我有一个处理器缓存类,它是一个单例并且有一个 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
    }
}

最佳答案

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

此外,如果您确实想使用 AtomReference,您应该只使用 set 方法,这样您就不必跟踪 oldProcessor.

关于java - 这是 Java 中 AtomicReference 的正确用例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30651856/

相关文章:

java - 如何从 DynamoDB 流新图像中获取纯 Json 字符串?

java - 如何在java中将进程构建器命令作为线程运行

linux - 在具有多个(物理)CPU 的系统上的多线程进程中,如何处理线程调度?

rust - 有没有办法将 "check and set"的值设为 `std::cell::Cell` ?

java - 注解代表另一个注解

java - 从 try finally block 中的 try block 返回

c++ - boost::lockfree:queue 中的内存排序

c++ - 在使用 libstdc++ 进行调试期间强制在 std::atomic 中使用锁

java - 为什么我的 HikariCP springboot 会抛出这个异常?

java - 返回ThreadPool时清除ThreadLocal值