当只有一个线程写入整数时,是否需要同步,而其他线程是否获得较旧的信息则无关紧要?

问题描述

我知道,如果这是关于HashMap或某些其他复杂对象的,我仍然需要添加同步。但是,图元也是如此吗?我的直觉是我不需要它,但我不确定。

解决方法

如果不在读取和写入之间添加“先发生”关系,则可能会导致数据争用。如果有一场数据竞赛,所有的赌注都将关闭。编译器可以以永远不会看到新值的方式优化代码。

如果您希望获得非常便宜的访问权限,则可以进行获取负载和商店发布。

例如https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/concurrent/atomic/AtomicLong.html

AtomicLong.getAcuire

AtomicLong.storeRelease

在X86平台上,每个负载都是一个获取负载,每个存储都是一个发行存储。因此,您将在硬件级别完全免费获得此功能。但是,它将阻止某些编译器优化。

如果您不太关心极端性能,那么挥发物就足够了。这将为您提供顺序一致的加载和存储。硬件级别的主要问题是,它阻止CPU执行任何加载,直到将存储缓冲区耗尽到1级缓存为止。在硬件级别上,易失性负载与获取负载同样昂贵。顺序一致性的代价在于写入。