ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

美团8连问

2022-03-07 11:32:27  阅读:175  来源: 互联网

标签:singleton 对象 美团 DclSingleton 内存 连问 new 线程


一、请解释一下对象的创建过程

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有