Java解决伪共享问题

Info

Java 8 中,可以使用 @Contended 注解来解决 伪共享 问题。该注解可以用于类、字段和方法上,它会让 JVM 在分配内存时,将注解的类、字段或方法所在的 缓存行 单独分配,从而避免多个 线程 访问同一 缓存行

如何使用@Contended 注解

@Contended 可以使用在类、字段和方法上

在类上使用@Contended

@Contended
public class MyClass {
    // fields and methods
}
Tip

这将会告诉 JVM 在分配内存时,将 MyClass 类所在的 缓存行 单独分配,从而避免多个 线程 访问同一 缓存行

在字段上使用@Contended 注解

public class MyClass {
    @Contended
    private long myField;
    // other fields and methods
}
Tip

这将会告诉 JVM 在分配内存时,将 myField 字段所在的 缓存行 单独分配,从而避免多个 线程 访问同一 缓存行

在方法上使用@Contended 注解

public class MyClass {
    @Contended
    public void myMethod() {
        // method body
    }
    // other fields and methods
}
Tip

这将会告诉 JVM 在分配内存时,将 myMethod 方法所在的 缓存行 单独分配,从而避免多个 线程 访问同一 缓存行

注意

Warning

@Contended 注解只在 Java 8 及以上版本的 HotSpot 虚拟机上才能生效。在使用@Contended 注解时,需要在启动 JVM 时添加参数“-XX:-RestrictContended”才能生效。此外@Contended 注解只在某些平台上才能生效,具体取决于 CPU 和操作系统的架构。例如,@Contended 注解在 x86 和 x64 架构上都可以生效,但在 ARM 架构上就不一定能够生效。

参考:

Java并发编程之美#^25462418-28-4855-4896

Java并发编程之美#^25462418-28-5686-5829