@sun.misc.Contended避免伪共享(false sharing)

转载自:http://www.myexception.cn/program/1630142.html

       Java8中使用sun.misc.Contended注解来避免伪共享(false sharing)。关于伪共享这个概念,可以先参照http://ifeve.com/falsesharing/

       伪共享的例子:
public class VolatileLong {
    volatile long v = 0L;
}
       如果有两个VolatileLong对象,会被load到同一个缓存行里面,如果一个线程要修改对象1,另一个线程同时要修改对象2,此时就要面对伪共享问题(core1对缓存行中对象1的修改,导致core2中同一缓存行失效,即缓存的对象2需要重新load)。

       jdk6中的解决办法:
public class VolatileLong {
    volatile long p0, p1, p2, p3, p4, p5, p6;
    volatile long v = 0L;
    volatile long q0, q1, q2, q3, q4, q5, q6;
}
       上面的方式也就是long padding来避免伪共享,使用无关数据来填充缓存行,使得两个VolatileLong对象不会load到同一个缓存行里面。无锁并发框架Disruptor正是采用的这种方式。

       long padding的解决办法不怎么优雅,并且在jdk7某个版本以后能会优化掉long padding,详细参考 http://ifeve.com/false-sharing-java-7/。但是java8已经给出了官方的解决办法,就是sun.misc.Contended注解。
// jdk8新特性,Contended注解避免false sharing
// Restricted on user classpath
// Unlock: -XX:-RestrictContended
@sun.misc.Contended
public class VolatileLong {
    volatile long v = 0L;
}
       这里,JVM就不会将被Contended注解的两个VolatileLong对象load到同一个缓存行里面。要注意的是user classpath使用此注解默认是无效的,需要在jvm启动时设置-XX:-RestrictContended。(不太理解。。。经测试,自己应用程序的sun.misc.Contended注解的类需要-XX:-RestrictContended才能生效,是不是对jdk源码中的sun.misc.Contended不需要上述注解就可以生效了?)
       jdk8中有很多地方已经使用了sun.misc.Contended:
       java/util/concurrent/ConcurrentHashMap.java
    /**
     * A padded cell for distributing counts.  Adapted from LongAdder
     * and Striped64.  See their internal docs for explanation.
     */
    @sun.misc.Contended static final class CounterCell {
        volatile long value;
        CounterCell(long x) { value = x; }
    }
       java/util/concurrent/Exchanger.java
    /**
     * Nodes hold partially exchanged data, plus other per-thread
     * bookkeeping. Padded via @sun.misc.Contended to reduce memory
     * contention.
     */
    @sun.misc.Contended static final class Node {
        int index;              // Arena index
        int bound;              // Last recorded value of Exchanger.bound
        int collides;           // Number of CAS failures at current bound
        int hash;               // Pseudo-random for spins
        Object item;            // This thread's current item
        volatile Object match;  // Item provided by releasing thread
        volatile Thread parked; // Set to this thread when parked, else null
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值