並行性に関する本で言及されている状況をシミュレートしたいと思います-適切な同期がなければ、あるスレッドが別のスレッドによって既に変更された変数の古い値を見ることができます。これは、たとえば CPU キャッシュが原因で発生する可能性があります。
これを行うために、次のプログラムを作成しました。アイデアは、共有配列の異なる部分を初期化する 4 つのスレッドがあるということです。5 番目のスレッド (メイン、親スレッド) は、前の 4 つのスレッドがすべて完了するまで待機し、共有配列を反復処理してその値を追加します (常に 1 または運が良ければ null、これは古い値を意味します)。
package p1;
class ArrFill implements Runnable {
int l, r;
Integer[] arr;
ArrFill(int l, int r, Integer[] arr) {
this.l = l;
this.r = r;
this.arr = arr;
}
@Override
public void run() {
for(int i = l; i < r; i++)
arr[i] = new Integer(1);
}
}
public class Main {
final static int MAX = 10000000;
final static int tnum = 4;
public static void main(String[] args) throws InterruptedException {
int cores = Runtime.getRuntime().availableProcessors();
System.out.println(cores);
Integer[] arr = new Integer[MAX];
Thread[] t = new Thread[tnum];
if(MAX % tnum != 0)
throw new IllegalStateException();
int step = MAX / tnum;
int l = 0, r = 0;
for(int i = 0; i < tnum; i++) {
l = r;
r += step;
t[i] = new Thread(new ArrFill(l, r, arr));
t[i].start();
}
for(int i = 0; i < tnum; i++)
t[i].join();
int res = 0;
for(int i = 0; i < MAX; i++)
if(arr[i] != null)
res += arr[i];
System.out.println(res == MAX);
}
}
古い値 (null) を見たことはありませんが、このプログラムを何度も実行しました。私は2つのコアを持っています。キャッシュされた値の現象を実際に表示するために、このプログラムをどのように改善できるか考えていますか? それとも、まったく異なるアプローチを取っているのでしょうか?
ありがとう!