jvm 基本结构
1,PC寄存器
每个线程拥有一个PC寄存器
在线程创建时 创建
指向下一条指令的地址
执行本地方法时,PC的值为undefined
2.方法区
保存装载的类信息
•类型的常量池
•字段,方法信息
•方法字节码
通常和永久区(Perm)关联在一起
3.Java堆
和程序开发密切相关
应用系统对象都保存在Java堆中
所有线程共享Java堆
对分代GC来说,堆也是分代的
GC的主要工作区间
4.Java栈
线程私有
栈由一系列帧组成(因此Java栈也叫做帧栈)
帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈
二 栈、堆、方法区交互
三.多线程运行的内存结构
内存模型
每一个线程有一个工作内存和主存独立
工作内存存放主存中变量的值的拷贝
public class VolatileStopThread extends Thread{
private volatile boolean stop = false;
public void stopMe(){
stop=true;
}
public void run(){
int i=0;
while(!stop){
i++;
}
System.out.println("Stop thread");
}
public static void main(String args[]) throws InterruptedException{
VolatileStopThread t=new VolatileStopThread();
t.start();
Thread.sleep(1000);
t.stopMe();
Thread.sleep(1000);
}
上述程序如果没有 private volatile boolean stop = false; 中的volatile关键字,在主函数中改变的值不会被别的线程看见,即VolatileStopThread线程不会停止
线程间可见性
含义:一个线程修改了变量,其他线程可以立即知道
保证可见性的方法
volatile
synchronized (unlock之前,写变量值回主存)
final(一旦初始化完成,其他线程就可见)