关于Object o = new Obejct() 过程中都发生了什么~~~

感谢大佬的录屏,延迟看一下JVM的视频课程,记一下笔记:

开篇这玩意儿我暂时也看不懂,先放在这里:
关于Object o = new Obejct() 过程中都发生了什么~~~

接下来给了一段创建对象的代码,以及它的java汇编码
关于Object o = new Obejct() 过程中都发生了什么~~~
字节码:
0.new ->申请内存。堆里有了一个新的内存。(半初始化。成员变量设置默认值
关于Object o = new Obejct() 过程中都发生了什么~~~
3 dup 因为invokespecial会消耗一份,所以必须先复制一份
4 invokespecial T initlize 初始化,调用他的构造方法
关于Object o = new Obejct() 过程中都发生了什么~~~
7 astore_1 把t与T建立关联
关于Object o = new Obejct() 过程中都发生了什么~~~
8 return

那么上图的第一个问题就解决了。看第二个问题。DCL与violatile

设计模式:单例:new Class时候,只要求内存中只能new出一个对象。
关于Object o = new Obejct() 过程中都发生了什么~~~
里面调getInstance永远只有一个对象

或者:
上来先判断,if instance为空再new出来。(多线程访问的时候并不安全,多线程可能会new多个instance)
关于Object o = new Obejct() 过程中都发生了什么~~~
所以如果有多线程访问时:在方法加synchronize。永远只有一个线程访问:

如果为空,再上锁。
关于Object o = new Obejct() 过程中都发生了什么~~~