2017-03-12 49 views
0

我有兩個線程,他們都讀取相同的靜態變量(一些大對象 - 一個500_000_000整數的數組)。Java靜態變量和緩存

兩個線程被固定到一個CPU(1和2)(CPU親和力),所以儘量減少抖動。

你知道兩個線程是否會因爲兩個線程在不同的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(); 
     } 
    } 
} 

感謝

+2

你能告訴我們一些代碼嗎? –

+0

只是增加了一些代碼 – EKK

+0

數組總是分配在堆上 - 無論如何,如果您從靜態或局部變量引用它們。讀取一個CPU上的內存不應該影響另一個CPU上的內存(在典型的x86 CPU上) –

回答

0

在你的情況也不會有一個緩慢的做多線程下來 - 因爲你正在做只讀取無需您的CPU之間的無效任何共享的狀態。

根據背景負載的不同,可能會有總線限制和內容,但是如果親和性也是在操作系統級定義的 - 那麼在易於預取的情況下將會有更多的CPU間和內核間的通信方式(因爲您按順序訪問數據)比內存CPU通信。背景負載也會影響單線程情況下的性能 - 因此無需爲此爭論。

如果整個系統專用於您的程序 - 比現代CPU上的約20Gb/s的內存帶寬更足夠用於您的數據集。