如何在Java中模拟线程读取的陈旧值?

时间:2013-02-23 18:47:56

标签: java concurrency synchronization

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

谢谢!

0 个答案:

没有答案