这是 Java 中 AtomicReference 的正确用例吗?
Is this a correct use case for AtomicReference in Java?
我有一个处理器缓存 class,它是一个单例并且有一个 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
class 中的 processor
字段,因此 volatile
字段更适合。您没有使用 AtomicReference
提供的额外功能。
此外,如果您确实想使用 AtomReference
,您应该只使用 set
方法,这样您就不必跟踪 oldProcessor
.
我有一个处理器缓存 class,它是一个单例并且有一个 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
class 中的 processor
字段,因此 volatile
字段更适合。您没有使用 AtomicReference
提供的额外功能。
此外,如果您确实想使用 AtomReference
,您应该只使用 set
方法,这样您就不必跟踪 oldProcessor
.