加6个无用的long字段
如:
public final static class VolatileLong2 { private long value ; private long q0, q1, q2, q3, q4, q5, q6; }
上面的做法其实有个问题:每个CPU微架构的cache line大小不一定一样,这种手动添加固定的padding字段的做法有可能浪费了空间、也有可能不够用。最好还是让VM来解决这个问题。
JVM在计算对象布局时会知道有字段被标记上了@Contended而自动根据CPU的特性给这个类添加padding,而不必手动去添加padding字段
可以参考:https://www.zhihu.com/question/30538696 中R大的回答
java8的做法:
使用 @sun.misc.Contended 注解,java8中的并发map就有用到的
注意 :jvm启动时设置-XX:-RestrictContended
如:
public final static class VolatileLong3 { @sun.misc.Contended private long value ; }