java内存模型及volatile关键字

 2019-12-10 16:03  阅读(812)
文章分类:Java Core

文章目录

一、基本概念

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

二、java内存模型

在java多线程程序执行时,各个线程都会先从主存中获取变量,然后在运行过程中对变量进行计算时,都是和自己线程中的变量进行交互,不同线程之间的变量彼此不可见。因此导致多个线程之间的变量不可见。
20191210001525\_1.png

三、volatile关键字

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

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> java内存模型及volatile关键字

相关推荐