Java中AtomicXXX上lazySet的用法

Aje*_*nga 2 java concurrency java.util.concurrent

来自这个问题:AtomicInteger lazySet vs. set并形成此链接:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html

我可以收集以下几点

  • lazySet 可能比 set 更快
  • lazySet 使用存储-存储屏障(尊重之前的写入,但不尊重尚未发生的竞争写入)

我可以从文档中找到一个可以应用它的用例:

  • 当您想要清空指针以帮助 GC 时,请使用lazySet。

lazySet 还有其他实际用例吗?

Ben*_*nes 5

Caffeine在其许多数据结构中使用惰性或宽松的写入。

  • 将字段清空时(例如 ConcurrentLinkedStack)
  • 在发布之前写入易失性字段时(例如 SingleConsumerQueue)
  • 当发布可以安全地延迟时(例如 BoundedBuffer)
  • 当竞争是良性的时(例如缓存过期时间戳)
  • 当在锁内时(例如 BoundedLocalCache)

ConcurrentLinkedQueue 在发布节点之前使用宽松的写入,并且可能会延迟设置节点的下一个字段(在发布之前或指示过时的遍历)。

您可能还喜欢阅读Linux 内核内存屏障论文。