volatile 不具有原子性

Posted wanjun-top

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile 不具有原子性相关的知识,希望对你有一定的参考价值。

volatile 具有可见性,顺序性,但是不具有原子性。

以一个列子来说明:

10个线程对 num++ 操作,num++ 是 num=num+1; 不是一个原子操作

package com.example.demo.thread;

public class VolatileAtomicTest {
    private static int num = 0;

    public static void increase(){
        num ++;
    }

    public static void main(String[] args) throws InterruptedException {
        Thread[] threads = new Thread[10];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int j = 0; j <1000 ; j++) {
                        increase();
                    }
                }
            });
            threads[i].start();
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].join();
        }
        System.out.println(num);
    }
}

多次运行结果:

num结果出现不一致,说明volatile不具有原子性

以上是关于volatile 不具有原子性的主要内容,如果未能解决你的问题,请参考以下文章

volatile 实现原理

多线程8---volatile2---多线程间变量的可见性不具备原子性---AtomicInteger

Java基础:volatile详解

Java-JUC:volatile对Java内存模型中的可见性原子性有序性影响

volatile的适用场景

为什么volatile++不是原子性的?