微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我知道,如果这是关于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级缓存为止。在硬件级别上,易失性负载与获取负载同样昂贵。顺序一致性的代价在于写入。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。