美团8连问
作者:互联网
一、请解释一下对象的创建过程
public class T { int m = 8; } T t = new T();
1、给m申请内存,将m进行半初始化,初始化0
2、调用构造方法,给m赋值8
3、将t对象的引用指向m
二、DCL与volatile问题
1、volatile:保证线程可见性,防止指令重排序
2、指令重排:
对象初始化的三个步骤:①申请内存,设默认值
②调用构造,设初始值
③建立关系
指令重排会将③放到②前
3、DCL要加volatile防止指令重排序
public class DclSingleton { private static volatile DclSingleton singleton; private DclSingleton() { } public static DclSingleton getDclSingleton() { if (singleton == null) { 这行加判空是为了提高效率,线程抢锁是比较消耗性能的 synchronized (DclSingleton.class) { if (singleton == null) { singleton = new DclSingleton(); } } } return singleton; } }
有两个线程,线程1抢到锁发现没有singleton对象后会new对象。
new对象时如果发生指令重排:先申请内存赋默认值-->对象和变量建立关联关系-->此时线程2进来判断第一个singleton==null,发现不为null(因为有默认值),会直接返回singleton(半初始化对象)
三、对象在内存中的存储布局
markword(8字节)、类型指针(4字节)、实例数据、对齐(根据前三部分在内存中所占大小决定,需要被8整除)
这4部分的空间要能被8整除,如果不能被整除的要对齐
四、对象头具体包括什么
markword(记录的是锁信息、gc信息和hashcode)和klasspointer
五、对象怎么定位
直接和间接
六、对象怎么分配
七、Object o = new Object()在内存中占多少字节
16字节
标签:singleton,对象,美团,DclSingleton,内存,连问,new,线程 来源: https://www.cnblogs.com/lyc-code/p/15975135.html