* * The CPU cache line commonly be 64 bytes, here is a sample of cache line after padding: * 64 bytes = 8 bytes (object reference) + 6 * 8 bytes (padded long) + 8 bytes (a long value) * * @author yutianbao */ public class PaddedAtomicLong extends AtomicLong { private static final long serialVersionUID = -3415778863941386253L; /** Padded 6 long (48 bytes) */ public volatile long p1, p2, p3, p4, p5, p6 = 7L; /** * Constructors from {@link AtomicLong} */ public PaddedAtomicLong() { super(); } public PaddedAtomicLong(long initialValue) { super(initialValue); } /** * To prevent GC optimizations for cleaning unused padded references */ public long sumPaddingToPreventOptimization() { return p1 + p2 + p3 + p4 + p5 + p6; } } ``` 对象引用8字节,使用了6个long变量48字节进行填充,以及一个long型的值,一共64字节。 使用了sumPaddingToPreventOptimization方法规避编译器或GC优化没使用的变量。 **Java8及以上的版本** 从Java8开始原生支持避免伪共享,可以使用`@Contended`注解: ```java public class Point { int x; @Contended int y; } ``` 详见`@Contended`注解使用方法。 >@Contended 注解会增加目标实例大小,要谨慎使用。默认情况下,除了 JDK 内部的类,JVM 会忽略该注解。要应用代码支持的话,要设置 -XX:-RestrictContended=false,它默认为 true(意味仅限 JDK 内部的类使用)。当然,也有个 –XX: EnableContented 的配置参数,来控制开启和关闭该注解的功能,默认是 true,如果改为 false,可以减少 Thread 和 ConcurrentHashMap 类的大小。参加《Java性能权威指南》210 页。 ### 参考资料 [伪共享(false sharing),并发编程无声的性能杀手 - 博客园](https://www.cnblogs.com/cyfonly/p/5800758.html) [伪共享(False Sharing)和缓存行(Cache Line) 大杂烩 - 简书](https://www.jianshu.com/p/a9b1d32403ea)
发布文章 101
文章被阅读 1590
最近修改
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。