【问题标题】:2 AtomicReferences can false share?2 AtomicReferences 可以假共享吗?
【发布时间】:2017-07-27 09:49:35
【问题描述】:

当我有

Object a;
Object b;

我有虚假分享

我不这样做

@Contended
Object a;
Object b;

如果我有

final AtomicReference<Object> a;
final AtomicReference<Object> b;

我还有虚假分享吗?

我的猜测是我不需要@Contended,因为尽管a,b 可能在同一个缓存行中,但它们所指的不是...

【问题讨论】:

    标签: java performance concurrency


    【解决方案1】:

    AtomicReference 的实例通常占用 16 字节(在 HotSpot JVM 上):12 字节对象头 + 4 字节值字段。如果两个 AtomicReference 在 Java 堆中彼此相邻,它们可能仍共享同一个缓存行,通常为 64 字节。

    注意:即使您在两个 AtomicReference 之间分配了一些对象,垃圾回收也可能会压缩堆,以便 AtomicReference 再次彼此相邻。

    有几种方法可以避免虚假分享:

    1. 扩展 AtomicReference 类并添加至少 6 个 long 字段 - 这将使您的引用占用 64 个字节或更多。

      -------------------------------------------------------------------------------
      | header | value | long1 | ... | long6 | header | value | long1 | ... | long6 |
      -------------------------------------------------------------------------------
                   ^                                      ^
                   |--------------- 64 bytes -------------|
      


    2. 使用AtomicReferenceArray 并将您的引用放置在至少 16 个单元格的距离处,例如一个参考将位于索引 16,另一个 - 在索引 32。

      ----------------------------------------------------------------------------
      | header |  len  |  0  |  1  |  ...  |  15 |  16 |  17 |  ...  |  31 |  32 |
      ----------------------------------------------------------------------------
                                                    ^                         ^
                                                    |-------- 64 bytes -------|
      

    【讨论】:

    • 啊,谢谢你的视觉效果,@Contended 不是避免它的一种方法吗? (假设我们知道它在热点上运行......)
    • @vach 默认情况下,@Contended 注释仅适用于特权类。为了使其适用于用户类,您必须使用 -XX:-RestrictContended 选项运行 JVM。
    猜你喜欢
    • 2015-02-16
    • 2011-08-27
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2018-10-27
    • 2011-04-12
    • 2012-07-06
    相关资源
    最近更新 更多