【发布时间】:2021-07-12 17:29:06
【问题描述】:
我有一个用例来更新长变量中事件的纪元时间。这个变量也将有大量的并发读取和写入。以下是详细要求:
- 读写完成速度非常快
- 读取可能会或可能不会返回最新结果,但不应返回损坏的结果
- 写入是对新纪元值的简单赋值,不需要加法、减法或计算
对于我的用例来说,哪些替代方案是更好的选择:
- 带有 volatile 关键字的原始 long
- AtomicLong
- 具有 accumulatorFunction 的 LongAccumulator 为
(x,y) -> y - 两个不同的变量 - 一个仅用于读取值,而另一个 volatile 变量仅用于写入值,写入变量 1 的值在某个时间间隔内被复制到读取变量
【问题讨论】:
-
如果您实际上并不关心读取正确的值,那您为什么还要关心存储值呢?
-
该值是当前时间戳,由5000个线程并发更新(在一秒内),我只要求它大约精确到1分钟。因此可以容忍读取不到一分钟的返回值
-
5K 线程。我闻到了一个严重的设计问题。
-
这是一个spring boot服务器,服务器每秒可以接收5k个http请求。在每个 http 请求中,我需要更新变量。同意每个 http 请求可能不会转换为新的 jvm 线程
-
在您的情况下,可能一个原子长度已经足够了。可能需要一些原子读取修改写入行为。
标签: java volatile java.util.concurrent atomic-long