java避免缓存伪共享

java8之前的做法:
加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 ;  
    } 


猜你喜欢

转载自huangyunbin.iteye.com/blog/2291368