好记性不如烂笔头,仅以此记录
20200526
对象的创建过程
源码:
class T{
int i = 8;
}
T t = new T();
汇编码:
0 new #2 <T>
3 dup
4 invokespecial #3 <T.<init>>
7 astore_1
8 return
汇编码的大概意思:
0 (new 内存空间) --> 3 dup (压栈 一个对象引用,原栈中已存在一个) -->4 init (为i 赋值,且消耗掉 dup的对象引用)
--> 7 (将栈中的另一个引用赋值给t) --> 8 return
注: astore 比 init 速度快的多得多,由于cpu存在乱序执行 ;会存在 init 执行等待返回过程中 ,去astore;这就是指令重排
以下是两个线程演示执行过程
thread 1 ----半初始化----> 0 new #2 <T>
--------> 7 astore_1
指令重排
---------> 4 invokespecial #3 <T.<init>>
thread 2 ------------------>
if(t != null) xxx -> 使用了半初始化状态的对象
volatile 可以禁用指令重排