0

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

谢谢!

4

0 回答 0