java静态变量和缓存

时间:2017-03-12 20:46:41

标签: java multithreading static affinity

我有两个线程,它们都读取相同的静态变量(一些大对象 - 一个500_000_000整数的数组)。

两个线程固定到cpu(1和2)(cpu affinity),因此可以最大限度地减少抖动。

你知道两个线程是否会因为静态变量在不同的cpu上运行的线程读取而相互减慢?

import net.openhft.affinity.AffinityLock;

public class BigObject {
    public final int[] array = new int[500_000_000];
    public static final  BigObject bo_static = new BigObject();

    public BigObject() {
        for( int i = 0; i<array.length; i++){
            array[i]=i;
        }
    }

    public static void main(String[] args) {
        final Boolean useStatic = true;
        Integer n = 2;
        for( int i = 0; i<n; i++){
            final int k = i;    
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    BigObject b;
                    if( useStatic){
                        b = BigObject.bo_static;
                    }
                    else{
                        b = new BigObject();
                    }
                    try (AffinityLock al = AffinityLock.acquireLock()) {
                        while(true){
                            long nt1 = System.nanoTime();
                            double sum = 0;
                            for( int i : b.array){
                                sum+=i;
                            }
                            long nt2 = System.nanoTime();
                            double dt = (nt2-nt1)*1e-6;
                            System.out.println(k + ": sum " + sum + " " + dt);
                        }
                    }
                }
            };
            new Thread(r).start();
        }
    }   
}

由于

1 个答案:

答案 0 :(得分:0)

在你的情况下,做多线程的速度会慢下来 - 因为你只做了读操作,不需要让你的CPU之间的任何共享状态无效。

根据背景负载,可能存在总线限制和内容,但如果在操作系统级别定义了亲和性,则可以通过简单的预取方式进行更多的CPU间和核心间通信(因为您按顺序访问数据)而不是memory-cpu通信。背景负载也会影响单线程情况下的性能 - 所以没有必要争论它。

如果整个系统专用于您的程序 - 那么现代CPU上的内存带宽约为20Gb / s,这对您的数据集来说已经足够了。