欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

volatile(四) 不具有原子性

程序员文章站 2022-03-03 16:14:18
...

这个 volatile 不具有原子性,这个我们改怎么测试才能说明问题呢?
目前先设计下面的方案吧,以后再有好的方案,我在更新文章

实验设计

10个线程,每个线程都对 volatile修饰的count进行++操作10000次

实验假设

  1. 假设一: 如果 volatile 修饰的 count++ 具有原子性
    预期结果:为10*10000 = 100000;

  2. 假设二: 如果 volatile 修饰的 count++ 操作不具有原子性
    预期结果:小于100000 的不确定的值。

public class TestVolatile {
    volatile int count = 0;

     void m() {
        for (int i = 0; i < 10000; i++) count++;
    }

    public static void main(String[] args) {
        TestVolatile t = new TestVolatile();

        List<Thread> threads = new ArrayList<Thread>();

        for (int i = 0; i < 10; i++) {
            threads.add(new Thread(t::m, "thread-" + i));
        }

        threads.forEach((o) -> o.start());

        threads.forEach((o) -> {
            try {
                o.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        System.out.println(t.count);

    }

}

运行结果:

第一次测试结果:90489
第二次测试结果:94560

测试结论

假设一不成立
结果符合假设二

总结

volatile 不能保证原子性