Java Memory Model基础

来源:互联网 发布:如何seo推广 编辑:程序博客网 时间:2024/05/17 22:24
Java 内存模型 ( Java Memory Model )

根据Java Language Specification中的说明, JVM系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。

每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。
java内存模型

其中, 工作内存里的变量, 在多核处理器下, 将大部分储存于处理器高速缓存中, 高速缓存在不经过内存时, 也是不可见的.

内存模型的特征
–Visibility 可见性 (多核,多线程间数据的共享)
–Ordering 有序性 (对内存进行的操作应该是有序的)

•JMM怎么体现可视性(Visibility) ? 
在JMM中, 通过并发线程修改变量值, 必须将线程变量同步回主存后, 其他线程才能访问到.
JMM怎么体现有序性(Ordering) ? 通过Java提供的同步机制或volatile关键字, 来保证内存的访问顺序.

Happens-Before Memory Model
如果B能够看到A动作产生的结果,我们说A happens-before B,JMM定义了一些这样的规则,如:
–Program order rule. Each action in a thread happens-before every action in that thread that comes later in the program order.
–Monitor lock rule. An unlock on a monitor lock happens-before every subsequent lock on that same monitor lock.
–Volatile variable rule. A write to a volatile field happens-before every subsequent read of that same field

为了实现 Happens-Before Ordering原则, Java及jdk提供的工具:
a, synchronized关键字
b, volatile关键字
c, final变量
d, java.util.concurrent.locks包(since jdk 1.5)
e, java.util.concurrent.atmoic包(since jdk 1.5)