62,620
社区成员
发帖
与我相关
我的任务
分享
程序从上到下从左到右,所以,先在栈中创建引用变量再在堆中创建对象,然后将堆中的内存地址赋值给栈中的引用变量,所以,是先申请内存,无论是栈还是堆.
public class Test {
public static void main(String[] args) {
Test t = new Test();
}
}
字节码是(JDK1.6):
Code:
Stack=2, Locals=2, Args_size=1
0: new #1; //class lxb/csdn/Test
3: dup
4: invokespecial #16; //Method "<init>":()V
7: astore_1
8: return
明显是 先在堆上申请一块内存,然后执行构造函数,最后让ref指向该对象;[/quote]
你这指令不能证明是1的情况啊,怪我没把问题描述清楚。其实这个问题是放到多线程环境下考虑的,虽然指令的执行顺序证明是1的情况,但是就算先可见性的问题,可能导致构造函数中的某些域没写被写回共享内存去,导致其他线程看到局部对象。
public class Test {
public static void main(String[] args) {
Test t = new Test();
}
}
字节码是(JDK1.6):
Code:
Stack=2, Locals=2, Args_size=1
0: new #1; //class lxb/csdn/Test
3: dup
4: invokespecial #16; //Method "<init>":()V
7: astore_1
8: return
明显是 先在堆上申请一块内存,然后执行构造函数,最后让ref指向该对象;