A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


//懒汉式(延迟加载的单例设计模式示例)
class DanLi
{
        private DanLi danLi=null;
        private DanLi()
        {
        }
        public static DanLi getDanLi()
        {
                if(danLi=null)
                {
                        synchronized(DanLi.class)
                        {
                                /*if(danLi=null)
                                {
                                        danLi=new DanLi();
                                }
                                */
                                danLi=new DanLi();//这边好像不需要if语句判断也可以啊!只不过多线程加载时,可能会出现danLi多次被付值的情况,但是好像影响不大啊??
                        }
                }
                return danLi;
        }

}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

4 个回复

倒序浏览
第二层 if(danLi=null)判断不能 省,不然可能会产生多个DanLi对象,且都能在不同线程上运行,不会把前面的DanLi对象替换掉
if(danLi=null)
                {//如果一个线程执行到这里,刚好发生线程切换,另一个线程接在进来。接在执行下面的同步代码块,创建DanLi对象1,并把该对象的地址返回,该线程拿到对象1。而当第一个线程被唤醒,继续new 出一个DanLi对象2,并返回对象2的地址,所以2个线程用的不是同一个对象。这就不是单例了。
                        synchronized(DanLi.class)
                        {
                                /*if(danLi=null)
                                {
                                        danLi=new DanLi();
                                }
                                */
                                danLi=new DanLi();//这边好像不需要if语句判断也可以啊!只不过多线程加载时,可能会出现danLi多次被付值的情况,但是好像影响不大啊??
                        }
                }
                return danLi;

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
明白了,谢谢啊
回复 使用道具 举报
不用客气,互相学习
回复 使用道具 举报
哥们,sa。。不网速太卡了。。踩了一下你的帖子、、、
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马