Volatile关键字的原理

4 篇文章 0 订阅
1 篇文章 0 订阅

Java内存模型的3大特性

Java 内存模型的3大特性分别是 : 原子性、可见性、有序性
原子性:世界上最小的单元是原子,不可再分割
比如:a=1,这个操作就是最小的单元,不可以再分割,这个就是一个原子操作
再比如:a++,等同于 a=a+1,这个操作可以拆分为3个步骤,第一步是获取变量a的值,第二步是将变量a 加 1得到结果值,第三步是将结果值赋值给a,这个这是一个非原子操作,非原子操作都是有线程安全,存在线程安全问题的共享变量,都需要使用锁来保证变量的原子性,在JDK1.5开始 就引入了JUC包,这个包是专门为并发编程设计的

可见性:线程之间做的事务操作,都是可见的,即一个线程修改的值 对另外一个线程是可见的,可见性发生在并发编程中,由于线程运行都有自己的内存,为了执行效率高,一般会将共享内存中的 变量缓存到线程中的内存中,这个时候的操作就是不可见的。
而Volatile关键字修饰的变量就可以保证变量可见,Volatile修饰的变量防止了线程缓存 和 重排序,但不能保证原子性

有序性:是指代码执行有序,Volatile本身就防止重排序的

Volatile关键字的原理

1、Volatile防止了线程缓存和重排序,在并发编程的环境下,一个线程占用一个cpu,cpu中有独自的缓存区(寄存器),这个缓存区用来存在线程在运行过程中涉及到的变量,线程间的缓存是不可见的,导致一个线程修改了变量,其他线程都看不到,这个只要我们去掉这个缓存,让线程每次都去主内存中去取变量,修改完都修改主内存中的值,这就可以达到可见的效果
2、禁止指令重排序优化。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊狸的Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值