volatile没有原子性(五)

简介: volatile没有原子性

volatile没有原子性

volatile的变量复合操作不具有原子性:比如i++;

案例

用synchronized:

class MyNumber{
    int number;
    public synchronized void addplus(){
        number++;
    }
}
public class VolatileNoAtomicDemo {
    public static void main(String[] args) {
        MyNumber mynumber = new MyNumber();
        for(int i = 1;i<=10;i++){
            new Thread(()->{
                for (int j = 1; j <= 1000; j++) {
                    mynumber.addplus();
                }
            },String.valueOf(i)).start();
        }
        //暂停2秒中
        try{ TimeUnit.SECONDS.sleep(2);}catch(InterruptedException e) {e.printStackTrace();}
        System.out.println(mynumber.number);
    }
}
运行结果:
10000

用volatile

class MyNumber{
    volatile int number;
    public void addplus(){
        number++;
    }
}
public class VolatileNoAtomicDemo {
    public static void main(String[] args) {
        MyNumber mynumber = new MyNumber();
        for(int i = 1;i<=10;i++){
            new Thread(()->{
                for (int j = 1; j <= 1000; j++) {
                    mynumber.addplus();
                }
            },String.valueOf(i)).start();
        }
        //暂停2秒中
        try{ TimeUnit.SECONDS.sleep(2);}catch(InterruptedException e) {e.printStackTrace();}
        System.out.println(mynumber.number);
    }
}
结果为:
9445  不是10000;

原因:number++实际上三个步骤

image.png

image.png

image.png

image.png

目录
相关文章
|
6月前
|
缓存 安全 Java
3.线程安全之可见性、有序性、原子性是什么?
3.线程安全之可见性、有序性、原子性是什么?
72 0
3.线程安全之可见性、有序性、原子性是什么?
|
6月前
|
安全 Java
7.volatile怎么通过内存屏障保证可见性和有序性?
7.volatile怎么通过内存屏障保证可见性和有序性?
61 0
7.volatile怎么通过内存屏障保证可见性和有序性?
|
6月前
|
缓存 Java
13.synchronized总结:怎么保证可见性、有序性、原子性?
13.synchronized总结:怎么保证可见性、有序性、原子性?
103 0
13.synchronized总结:怎么保证可见性、有序性、原子性?
|
6月前
|
缓存 安全 Java
5.volatile是什么?怎么保证可见性?
5.volatile是什么?怎么保证可见性?
72 0
5.volatile是什么?怎么保证可见性?
|
6月前
|
Java
使用synchronized解决原子性问题
使用synchronized解决原子性问题 在多线程编程中,原子性问题是指一个操作在执行过程中不会被中断的特性。如果一个操作不具备原子性,那么在多线程环境下可能会导致数据被破坏或者出现其他问题。Java中提供了synchronized关键字来解决原子性问题。
|
缓存 算法 安全
从内存可见性看volatile、原子操作和CAS算法
从内存可见性看volatile、原子操作和CAS算法
52 0
|
缓存 Java 编译器
【多线程:volatile】有序性
【多线程:volatile】有序性
138 0
|
Java 编译器
【多线程:volatile】可见性
【多线程:volatile】可见性
141 0
|
SQL 存储 算法
volatile详解
在单线程环境中,我们几乎用不到这个关键词,但是多线程环境中,这个关键词随处可见。而且也是面试的常客。总的来说,volatile有以下三个特性: 保证可见性; 不保证原子性; 禁止指令重排。 下面就来详细的说说这三个特性。
volatile详解