java多线程 可见性 原子性 有序性及问题所在

可见性:

我们的数据统一存储到我们的JMM的主内存当中。假如说同时有多个线程进来访问,那么我们多个线程并不是直接对主内存的数据进行修改
而是把各个数据拷贝到自己的工作内存当中,对其修改完再放回给主内存。这时并通知其他线程 这就是我们说的可见性。
JMM:java内存模型 一种抽象的内存模型 并不真实存在。
在这里插入图片描述

原子性:

如我们一个简单的n++的命令在底层字节码文件里其实是四个命令。如果加了volatile即使保证了我们的可见性。但是在线程t1在执行第7步的时候被挂起了,线程t2对值进行了修改,那么t1在拿到cpu调度权的一瞬间直接就把数据写入到了内存。不保证原子性就会出现写丢失的情况。所以我们在多线程的情况下一定要保证可见性,原子性
AtomicInteger atomicInteger = new AtomicInteger(); 这个是保证了原子性的一个Integer类型
在这里插入图片描述

有序性:

计算机在执行程序时,为了提高性能,会把我们写的程序的命令按照最优的方式把指令进行重排
源代码—>编译器优化的重排—>指令并行的重排—>内存系统的重排—>最终执行的命令。
但是重排时必须要考虑到指令之间的数据依赖性 所以我们在多线程环境下要避免指令进行重新排序 这就是有序性
在这里插入图片描述
我们的volatile实现了禁止指令重排的优化,从而避免了多线程环境下程序出现乱序的现象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值