volatile测试问题

发布于 2022-09-12 23:58:04 字数 1594 浏览 20 评论 0

运行下面的代码,按预期结果应该是: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。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寻找我们的幸福 2022-09-19 23:58:04
total = account[j] ? total + 1 : 0;

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文