学习自深入理解JVM,仅做个人记录使用
为了消除不同硬件、操作系统之间的差异性
简单来说:我们是在和JVM进行交互,适配问题,交给JVM去做
主要目标:定义变量访问规则——把变量存储到内存和从内存中取出变量这样的细节。这不包括局部变量和方法参数,虽然这些引用指向的对象是存在heap中的,但是引用本身是存在于stack的局部变量表中的。
内存模型规定内存分为主内存和工作内存。所有的变量都存储在主内存中,工作内存中保存了用到的主内存的变量的拷贝。不同线程间无法直接访问各自工作内存中的变量。
主内存主要对应于heap中的对象的数据部分,工作内存对应于stack的部分区域。前者倾向于放置在内存中,后者倾向于放置在寄存器和高速缓存中。
volatile,可见性,其原理就是一条线程操作了一个主内存的变量,读进来,修改,写出去。这个流程以后,这个变量才对另外线程可见。但是却不保证原子性。禁止指令重排序,防止拿着未初始化完全的配置信息去工作。其原理是在上方加了一个内存屏障,不允许后面的代码重排序到前面。DCL的弊端众说纷纭,我这里也不作学习了。还是简单的:
public class Singleton {
private staticSingletion = null;
public voidgetInstance() {
return SingletionHolder.singletion;
}
static classSingletonHolder {
Singleton singleton = new Singleton();
}
privateSingletion() {
//dosth
}
}
总结
就是大概是这张图,然后还有一些规则,不用去记忆
还有就是volatile
线程的实现方式
1.内核线程->轻量级线程
2.用户线程
3.混合