jVM的启动流程
先来说下JVM的启动流程
1) 创建JVM装载环境和配置
2) 装载JVM.dll
3) 初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4) 调用JNIEnv实例装载并处理class类。
JVM的基本结构
总体来说分为三部分
- 加载.class文件
- 执行垃圾收集
有了上图的基本了解后,再看看每个结构的工作内容有哪些。
其实每一个线程有一个工作内存和主存独立,他们的内存模型是什么样的
内存模型
当数据从主内存复制到工作存储时,必须出现两个动作:第一,由主内存执行的读(read)操作;第二,由工作内存执行的相应的load操作;当数据从工作内存拷贝到主内存时,也出现两个操作:第一个,由工作内存执行的存储(store)操作;第二,由主内存执行的相应的写(write)操作。
对于普通变量,一个线程中更新的值,不能马上反应在其他变量中
如果需要在其他线程中立即可见,需要使用 volatile 关键字
代码块
代码块语法遵循标准markdown代码,例如:
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);
}
没有volatile -server 运行 无法停止
小结
jvm内存模型中变量的可见性在工作中是常遇见的。若你没有注意到这点,那么难免就会中招。更新变量无效。这是不可忽视的一个问题。