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

目录
相关文章
|
7月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras
在深度学习的世界中,PyTorch、TensorFlow和Keras是最受欢迎的工具和框架,它们为研究者和开发者提供了强大且易于使用的接口。在本文中,我们将深入探索这三个框架,涵盖如何用它们实现经典深度学习模型,并通过代码实例详细讲解这些工具的使用方法。
|
运维 安全 数据库
构建多租户应用程序:深入探讨Entity Framework Core中的租户支持策略与实现
【8月更文挑战第31天】在现代软件开发中,多租户架构因高效利用资源和简化运维而备受企业青睐,尤其在SaaS应用中。本文以一个多租户在线调查应用为例,介绍如何在Entity Framework Core中实现多租户支持。首先,在实体中添加`TenantId`字段以区分不同租户的数据;其次,在查询时根据当前租户信息进行筛选。这种方法简单有效,能确保数据安全隔离,但也需关注随着租户数量增长带来的数据库管理复杂性问题,并考虑分区表等优化策略。
168 0
|
资源调度 JavaScript 前端开发
vue3怎么调用vant中的icon组件
vue3怎么调用vant中的icon组件
460 4
ARIMA、ARIMAX、 动态回归和OLS 回归预测多元时间序列
ARIMA、ARIMAX、 动态回归和OLS 回归预测多元时间序列
ARIMA、ARIMAX、 动态回归和OLS 回归预测多元时间序列
|
Shell Linux C语言
【Shell 命令集合 磁盘维护 】Linux cfdisk命令使用教程 磁盘分区管理工具
【Shell 命令集合 磁盘维护 】Linux cfdisk命令使用教程 磁盘分区管理工具
209 0
|
存储 JavaScript 编译器
【TypeScript教程】# 3:TS的类型声明
【TypeScript教程】# 3:TS的类型声明
325 0
【TypeScript教程】# 3:TS的类型声明
|
存储 SQL 开发框架
软考——软件设计师:第二章:数据库技术考点总结(完整篇)(上)
软考——软件设计师:第二章:数据库技术考点总结(完整篇)(上)
软考——软件设计师:第二章:数据库技术考点总结(完整篇)(上)
|
弹性计算 网络协议 Java
记一次time_wait & close_wait的讨论总结
记一次time_wait & close_wait的讨论总结
记一次time_wait & close_wait的讨论总结
|
存储 SQL 缓存
如何用存储黑科技解决推荐系统的“信息过载”?
如何用存储黑科技解决推荐系统的“信息过载”?
350 0