java内存模型及volatile关键字

一、基本概念

在并发编程过程中,我们经常会遇到三类问题:原子性问题,可见性问题,有序性问题。下面我们来介绍一下和这些问题相关的三个概念。
1.原子性
也就是执行一个操作,要不全部执行成功,要不执行失败。比如a=0,这个操作就是原子性的,要么赋值成功,要么赋值失败。再比如a++操作,这个操作就不是原子性的,它是三步操作的组合:a)获取a的值。b)执行a=a+1操作。c)写入新的a的值
2.可见性
就是说再一个线程中执行对改变了一个变量,在另一个线程中依然能看到这个变量改变后的值,我们可以使用volatile来保证线程之间变量的可见性。
3.有序性
在java内存模型中,为了提高性能,允许JVM对代码执行重排序,这种操作在单线程中不会有问题,但是会影响多线程程序的正确性。而volatile和synchronized关键字以及Lock都可以保证程序的有序性。

二、java内存模型

在java多线程程序执行时,各个线程都会先从主存中获取变量,然后在运行过程中对变量进行计算时,都是和自己线程中的变量进行交互,不同线程之间的变量彼此不可见。因此导致多个线程之间的变量不可见。
在这里插入图片描述

三、volatile关键字

一个被volatile关键字修饰的变量,会有两层语义。
  1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
  2)禁止进行指令重排序。
一个被volatile修饰的变量,在每次被使用到时,会强制从主存中去获取,当计算完成,会强制将变量写入主存,这样就保证了线程间变量互相可见。
volatile关键字只会保证可见性和有序性,而不能保证原子性,而synchronized关键字既可以保证原子性,又可以保证可见性,又可以保证有序性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值