volatile测试问题

运行下面的代码,按预期结果应该是:52,但是返回结果是 0

public class MyVolatile {
    private volatile static boolean[] account;

    public static void main(String[] args) {
        //1 init
        account = new boolean[100];
        Arrays.fill(account, false);

        //2 iterate
        ArrayList<Thread> arrayList = new ArrayList<Thread>();
        for (int i = 0; i < 52; i++) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int j = 0; j < account.length; j++) {
                        System.out.println(Thread.currentThread() + " - " + j + ":" + account[j]);
                        if (account[j] == false) {
                            account[j] = true;
                            return;
                        }
                    }
                    System.out.println("no --- " + Thread.currentThread());
                }
            });
            arrayList.add(thread);
        }

        for (Thread thread : arrayList) {
            thread.start();
        }

        //3 end
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        int total = 0;
        for (int j = 0; j < 100; j++) {
            total = account[j] ? total + 1 : 0;
        }
        System.out.println("finally:" + total);
    }
}

为什么?为什么account数组里面全都是false?

如果把account数组的长度修改为52的话,结果total为:52。

当account数组的长度大于线程数时,结果总是为0。

阅读 1.7k
1 个回答
total = account[j] ? total + 1 : 0;

后面的都是 false,直接给 total 赋值 0

你和隔壁的 https://segmentfault.com/q/10... 是一个人好几个小号么?问题差不多然而是两个人?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题