1. 当前位置:首页>百科>什么是多线程环境下的伪共享(false sharing)?

什么是多线程环境下的伪共享(false sharing)?

在Java中,伪共享(false sharing)是指多线程环境下,由于缓存一致性协议的影响,不同线程访问同一缓存行中的不同数据造成的性能下降现象。当多个线程同时访问不同变量,但这些变量存储在同一缓存行中时,每个线程只修改自己的变量,但由于缓存一致性协议的要求,需要将整个缓存行的数据进行更新,导致其他线程缓存的数据失效,从而影响了性能。

  接下里笔者用一段简单的Java代码,来演示下伪共享的效果:

public class FalseSharingDemo implements Runnable {    private static final int NUM_THREADS = 2;    private static final long ITERATIONS = 500000000L;    private static final int ARRAY_SIZE = 8;    private static VolatileLong[] longs = new VolatileLong[ARRAY_SIZE];    static {        for (int i = 0; i < ARRAY_SIZE; i++) {
           longs[i] = new VolatileLong();
       }
   }    private final int arrayIndex;    public FalseSharingDemo(int arrayIndex) {        this.arrayIndex = arrayIndex;
   }    public static void main(String[] args) throws InterruptedException {
       Thread[] threads = new Thread[NUM_THREADS];        for (int i = 0; i < NUM_THREADS; i++) {
           threads[i] = new Thread(new FalseSharingDemo(i));
       }        for (Thread t : threads) {
           t.start();
       }        for (Thread t : threads) {
           t.join();
       }
   }    public void run() {        long i = ITERATIONS + 1;        while (--i > 0) {
           longs[arrayIndex].value = i;
       }
   }    public static class VolatileLong {        public volatile long value = 0L;
   }
}

  在上面的示例代码中,我们创建了一个包含多个VolatileLong对象的数组。每个VolatileLong对象都包含一个volatile修饰的long类型的变量。在run()方法中,每个线程都会通过循环将自己的索引对应的VolatileLong对象的value字段设置为递减的值。

  当我们运行该示例代码时,由于VolatileLong对象存储在同一缓存行中,不同线程对不同的VolatileLong对象进行操作,但由于缓存一致性协议的要求,每次写操作都会导致整个缓存行的数据失效。这将引起多个线程之间频繁的缓存行无效和更新,导致性能下降。

  为了解决伪共享问题,可以使用填充(padding)技术来确保不同变量在不同的缓存行中,从而避免了不必要的缓存行无效和更新。可以通过在VolatileLong类中增加填充字段来解决伪共享问题,例如:

public static class VolatileLong {    public volatile long value = 0L;    public long padding1, padding2, padding3, padding4, padding5, padding6;
}

  通过在VolatileLong类中添加填充字段,可以将不同的VolatileLong对象分散到不同的缓存行中,从而避免了伪共享带来的性能下降。


本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.5amiao.com/baike/1646.html

联系我们

在线咨询:点击这里给我发消息

QQ号:1045784018

工作日:10:00-17:00,节假日休息