我想模拟在有关并发的书籍中提到的一种情况 - 如果没有适当的同步,一个线程可以看到已经被另一个线程修改的变量的陈旧值。这可能是因为例如 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个核心。您知道如何改进该程序以实际呈现缓存值现象吗?或者也许你有一个完全不同的方法?
谢谢!