lazySetsetAtomicInteger方法有什么区别? documentation关于lazySet的话不多:


  最终设置为给定值。


似乎存储的值不会立即设置为所需值,而是计划在将来的某个时间设置。但是,这种方法的实际用途是什么?有什么例子吗?

最佳答案

直接从"JDK-6275329: Add lazySet methods to atomic classes"引用:


  作为Mustang的最后一次JSR166后续活动,
  我们向原子类添加了“ lazySet”方法
  (AtomicInteger,AtomicReference等)。这是一个利基
  在使用以下方法微调代码时有时有用的方法
  非阻塞数据结构。语义是
  确保写操作不会与任何命令重新排序
  先前的写入,但可能会因后续操作而重新排序
  (或等效地,可能对其他线程不可见),直到
  其他一些易失性写入或同步操作)。
  
  主要用例是使
  非阻塞数据结构仅是为了避免
  长期保留垃圾;当它无害时适用
  如果其他线程在一段时间内看到非空值,但是您会
  希望确保结构最终可用于GC。在这样的
  情况下,您可以避免
  空volatile写入的成本。有几个
  这些基于非引用的用例的其他用例
  原子,因此该方法在所有
  AtomicX类。
  
  对于喜欢从以下方面考虑这些操作的人
  通用多处理器lazySet上的计算机级别障碍
  提供了先行的商店-商店壁垒(可以是
  在当前平台上没有操作或非常便宜),但没有
  存储负载屏障(通常是昂贵的部分
  易失性写入)。

09-07 03:08