💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### Java中的伪共享 解决伪共享最直接的方法就是填充(padding),例如下面的VolatileLong,一个long占8个字节,Java的对象头占用8个字节(32位系统)或者12字节(64位系统,默认开启对象头压缩,不开启占16字节)。一个缓存行64字节,那么我们可以填充6个long(6 \* 8 = 48 个字节)。这样就能避免多个VolatileLong共享缓存行 ~~~ public class VolatileLong { private volatile long v; // private long v0, v1, v2, v3, v4, v5 // 去掉注释,开启填充,避免缓存行共享 } ~~~ 这是最简单直接的方法,Java 8中引入了一个更加简单的解决方案:`@Contended`注解: ~~~ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface Contended { String value() default ""; } ~~~ Contended注解可以用于类型上和属性上,加上这个注解之后虚拟机会自动进行填充,从而避免伪共享。这个注解在Java8 ConcurrentHashMap、ForkJoinPool和Thread等类中都有应用。我们来看一下Java8中ConcurrentHashMap中如何运用Contended这个注解来解决伪共享问题。以下说的ConcurrentHashMap都是Java8版本