我们什么时候用AtomicReference

是否需要在所有多线程程序中创建对象?

提供一个应使用原子引用的简单示例.

推荐答案

原子引用应用于需要对引用执行简单atomic(即thread-safe,非平凡)操作的设置,而基于监视器的同步不适用于该设置.假设只在对象的状态保持上次判断时,才判断特定字段:

AtomicReference<Object> cache = new AtomicReference<Object>();

Object cachedValue = new Object();
cache.set(cachedValue);

//... time passes ...
Object cachedValueToUpdate = cache.get();
//... do some work to transform cachedValueToUpdate into a new version
Object newValue = someFunctionOfOld(cachedValueToUpdate);
boolean success = cache.compareAndSet(cachedValue,cachedValueToUpdate);

由于原子引用语义,即使cache对象在线程之间共享,您也可以做到这一点,而无需使用synchronized.通常,除非您知道自己在做什么,否则最好使用同步器或java.util.concurrent框架,而不是赤裸裸的Atomic*.

将向您介绍此主题的两个优秀的死树参考资料:

请注意(我不知道这是否一直都是正确的)reference赋值(即=)本身是原子的(更新primitive个64位类型,如longdouble可能不是原子的;但是更新reference总是原子的,即使它是64位的),而不显式使用Atomic*.
请看Java Language Specification 3ed, Section 17.7.

Java相关问答推荐

那么比较似乎不是词典学的,尽管doctor 这么说

将具有多个未知字段的SON映射到Java POJO

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

gitlab ci不会运行我的脚本,因为它需要数据库连接'

springboot start loge change

给定Java枚举类,通过值查找枚举

我找不到&Quot;配置&的位置

为什么使用JDK21获取锁定锁比使用JDK11慢

通过移动一个类解决了潜在的StubbingProblem.它怎麽工作?

Spring @Value default无法计算表达式

如何为JavaFX Spring Boot应用程序制作Windows/MacOS/Linux安装程序

使用用户引入的参数生成人员数组

如何在Jooq中获取临时表列引用?

将stringBuilder + forloop转换为stream + map

如何在ApacheHttpClient 5中为单个请求设置代理?

为什么相同的数据条码在视觉上看起来不同?

如何对存储为字符串的大数字数组进行排序?

在Java Spring JPA中插入包含对其他实体的引用的列

如何在Java中的重写方法参数中强制(Enum)接口实现?

为什么我的登录终结点不能被任何请求访问?