我们都知道主内存,即直接内存(Native Memory)。那工作内存是什么呢?
工作内存四个字,可能很多人是从周志明的《深入理解Java虚拟机》看到的,也有很多人是看文章看帖子看到的。现在网上搜到的帖子基本是照搬书里的描述,导致误导了大片大片的童鞋。
不是说周志明老师说得不对,而是表达得不够精确,导致出现了很多认知上的歧义。最近研究了下这块,写篇文章记录下我的研究结果。
我这边先抛个结论给大家:工作内存 = 虚拟机栈,对否?大家先想想。
volatile
不知道童鞋们有么有这样的疑问:
- 为什么需要volatile?
- volatile的出现解决了什么问题?
今天这篇文章主要讨论工作内存,为了搞清楚工作内存,所以需要了解volatile,更深入的理解将会在之后的文章中给大家分享,也请大家持续关注我的博客。
线程同步三大特性:原子性、可见性、有序性。volatile的出现是为了保证可见性、有序性以及单次读写的原子性。如果想保证代码段的原子性执行需用到synchronized。
那volatile是如何保证可见性的呢?
本质是读写volatile修饰的变量时会实时同步工作内存与主内存。所以我借助volatile关键字证明给大家看我的结论:工作内存=虚拟机栈 + 方法区(元空间)+ 堆区。
虚拟机栈是工作内存的一部分,这个我就不写代码证明了。
工作内存与方法区
国际惯例,先上代码
public class Test3 {
public static boolean found = false;
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
System.out.println("等基友送笔来...");
while<