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