【问题标题】:Atomic assignment of long value in javajava中长值的原子赋值
【发布时间】:2021-07-12 17:29:06
【问题描述】:

我有一个用例来更新长变量中事件的纪元时间。这个变量也将有大量的并发读取和写入。以下是详细要求:

  1. 读写完成速度非常快
  2. 读取可能会或可能不会返回最新结果,但不应返回损坏的结果
  3. 写入是对新纪元值的简单赋值,不需要加法、减法或计算

对于我的用例来说,哪些替代方案是更好的选择:

  1. 带有 volatile 关键字的原始 long
  2. AtomicLong
  3. 具有 accumulatorFunction 的 LongAccumulator 为 (x,y) -> y
  4. 两个不同的变量 - 一个仅用于读取值,而另一个 volatile 变量仅用于写入值,写入变量 1 的值在某个时间间隔内被复制到读取变量

【问题讨论】:

  • 如果您实际上并不关心读取正确的值,那您为什么还要关心存储值呢?
  • 该值是当前时间戳,由5000个线程并发更新(在一秒内),我只要求它大约精确到1分钟。因此可以容忍读取不到一分钟的返回值
  • 5K 线程。我闻到了一个严重的设计问题。
  • 这是一个spring boot服务器,服务器每秒可以接收5k个http请求。在每个 http 请求中,我需要更新变量。同意每个 http 请求可能不会转换为新的 jvm 线程
  • 在您的情况下,可能一个原子长度已经足够了。可能需要一些原子读取修改写入行为。

标签: java volatile java.util.concurrent atomic-long


【解决方案1】:

使用AtomicLong,因为它有助于避免显式锁定的额外开销

【讨论】:

  • 为什么比volatile好?
  • @VGR 使用volatile可以达到synchronization的沟通效果;不是atomicity。要执行原子操作,我们需要用synchronization 保护对volatile 成员的写访问。另一方面,您可以使用 AtomicLong 而不使用额外的显式保护 synchronization 为了更好地理解,请阅读 Effective Java - Joshua Bloch 中的 Item 78
猜你喜欢
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2019-05-05
  • 2011-01-18
  • 2011-06-04
  • 2011-07-26
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多