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(一旦初始化完成,其他線程就可見)