java内存模型

java内存模型规定了所有变量都存储在主内存(虚拟机内存的一部分)

每条线程还有自己的工作内存。线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝。线程对变量的所有操作都必须在内存中进行。而不能直接读写主内存中的变量。

不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

volatile变量依然有工作内存的拷贝,但是由于它特殊的操作顺序性规定,所以看起来如同直接在主内存中读写访问一般,因此这里的描述对于volatile也并不存在例外。

主内存主要对应于java堆中的对象实例数据部分。而工作内存则对应于虚拟机栈中的部分区域。从更低层次上说,主内存就直接对应于物理硬件的内存。而为了获取更好的运行速度,虚拟机可能会让工作内存优先存储于寄存器和高速缓存中,因为程序运行时主要访问读写的是工作内存。

内存间交互操作:

8种操作

 

valatile具备两种特性:

1.保证此变量对所有线程的可见性。当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。

2.禁止指令重排优化,内存屏障:重排序时不能把后面的指令重排到内存屏障之前的位置。lock前缀:IA32 手册,使得本cpu的cache写入了内存,该写入动作也会引起别的cpu或者别的内核无效化其cache,所以通过这样一个操作,可让前面volatile变量的修改对其他cpu立即可见。

posted @ 2020-11-13 01:24  l2c  阅读(75)  评论(0)    收藏  举报