黑马程序员技术交流社区

标题: 懒汉式(延迟加载的单例设计模式示例)???? [打印本页]

作者: 孙国军    时间: 2012-4-9 23:03
标题: 懒汉式(延迟加载的单例设计模式示例)????

//懒汉式(延迟加载的单例设计模式示例)
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;
        }

}
作者: 曾晓文    时间: 2012-4-9 23:20
第二层 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;
作者: 孙国军    时间: 2012-4-9 23:25
明白了,谢谢啊

作者: 曾晓文    时间: 2012-4-10 12:01
不用客气,互相学习
作者: 马超    时间: 2012-4-10 12:45
哥们,sa。。不网速太卡了。。踩了一下你的帖子、、、




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2