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();
}
}
}
感謝
你能告訴我們一些代碼嗎? –
只是增加了一些代碼 – EKK
數組總是分配在堆上 - 無論如何,如果您從靜態或局部變量引用它們。讀取一個CPU上的內存不應該影響另一個CPU上的內存(在典型的x86 CPU上) –