Java内存模型

2018-02-22  本文已影响10人  34sir

如果对内存模型没有一个基本的了解,建议先看有关并发编程

书归正传,以大家都已经熟悉了内存模型中的原子性可见性有序性为前提,我们来聊一聊Java对这三者提供了哪些保证

原子性

分析一下下面的这段代码,看看哪些是原子性操作

x = 1;         //语句1
y = x;         //语句2
x++;           //语句3
x = x + 1;     //语句4

答案:只有语句1才是原子性操作

下面我们分析一下:
语句1:单纯的将数值1赋给x,也就是直接将1写入到工作内存中,一个步骤,显然满足原子性
语句2:先读取x的值,再将x的值写入工作内存,两个步骤,显然不满足原子性
语句3:先读取x的值,然后进行加一操作,然后写入工作内存,三个步骤,显然不满足原子性
语句4:同语句三,有三个步骤,不满足原子性

对于原子性的判断做个总结:
只有简单的读取、赋值(而且必须是将数值赋值给某个变量,变量之间的相互赋值不是原子操作)才是原子操作
如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现

可见性

Java保证可见性的,两种方式:

有序性

Java保证有序性的两种方式

关于有序性,Java中默写情况下是默认具备有序性的,这个通常被叫做happens-before原则,满足此原则的就能保证有序性

下面介绍一下happens-before(先行发生)原则:

上一篇下一篇

猜你喜欢

热点阅读