【五】Java内存模型(JMM)

Java Memory Model (JAVA 内存模型)描述线程之间如何通过内存(memory)来进行交互。 具体说来, JVM中存在一个主存区(Main Memory或Java Heap Memory),对于所有线程进行共享,而每个线程又有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作并非发生在主存区,而是发生在工作内存中,而线程之间是不能直接相互访问,变量在程序中的传递,是依赖主存来完成的。

硬件的效率与一致性:

有了CPU高速缓存虽然解决了效率问题,但是它会带来一个新的问题:数据一致性(可见性,下篇文章将会讲解)。

在程序运行中,会将运行所需要的数据复制一份到CPU高速缓存中,在进行运算时CPU不再也主存打交道,

而是直接从高速缓存中读写数据,只有当运行结束后才会将数据刷新到主存中

主内存与工作内存:

Java内存模型(JMM)的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节

例如:

线程从堆中取数据和存储数据到堆中的更加底层的细节。

将栈中的变量指向堆中的数据并进行操作的这一概念进行细化了的模型。

工作内存与主内存的同步:

当线程结束时,会将其对应的工作内存中的数据刷新到主存中。

其实JVM针对现在的硬件水平已经做了很大程度的优化,基本上很大程度的保障了工作内存和主内存的及时同步,相当于默认使用了volatile。但只是最大程度!在CPU资源一直被占用的时候,工作内存与主内存中间的同步,也就是变量的可见性就会不那么及时!

JMM关于synchronized(lock)的两条规定:

1. 线程解锁前,必须把共享变量的最新值刷新到主内存中

2. 线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值。

sysout、sleep等释放cpu的操作(输入和输出都将会释放cpu)都可以将工作区中的数据刷新到主存中。

猜你喜欢

转载自blog.csdn.net/Jack_PJ/article/details/87981177