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