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
使用synchronized解决原子性问题
使用synchronized解决原子性问题 在多线程编程中,原子性问题是指一个操作在执行过程中不会被中断的特性。如果一个操作不具备原子性,那么在多线程环境下可能会导致数据被破坏或者出现其他问题。Java中提供了synchronized关键字来解决原子性问题。
|
缓存 Java 编译器
|
Java
浅谈volatile
浅谈volatile
68 0
|
SQL
volatile的正确使用(七)
volatile的正确使用(七)
106 0
volatile的正确使用(七)
|
存储 缓存 人工智能
volatile(三)
volatile 这个关键字大家都不陌生,这个关键字一般通常用于并发编程中,是 Java 虚拟机提供的轻量化同步机制,你可能知道 volatile 是干啥的,但是你未必能够清晰明了的知道 volatile 的实现机制,以及 volatile 解决了什么问题,这篇文章我就来带大家解析一波。
volatile(三)
|
SQL 存储 算法
volatile详解
在单线程环境中,我们几乎用不到这个关键词,但是多线程环境中,这个关键词随处可见。而且也是面试的常客。总的来说,volatile有以下三个特性: 保证可见性; 不保证原子性; 禁止指令重排。 下面就来详细的说说这三个特性。
volatile详解
|
算法 Java 编译器
线程安全性详解(原子性、可见性、有序性)()2
线程安全性详解(原子性、可见性、有序性)
201 0
线程安全性详解(原子性、可见性、有序性)()2
|
消息中间件 分布式计算 安全
线程安全性详解(原子性、可见性、有序性)(1)
线程安全性详解(原子性、可见性、有序性)
169 0
线程安全性详解(原子性、可见性、有序性)(1)
|
存储 缓存 安全
volatile(一)
volatile 这个关键字大家都不陌生,这个关键字一般通常用于并发编程中,是 Java 虚拟机提供的轻量化同步机制,你可能知道 volatile 是干啥的,但是你未必能够清晰明了的知道 volatile 的实现机制,以及 volatile 解决了什么问题,这篇文章我就来带大家解析一波。
volatile(一)