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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 白_蓝(八公) 中级黑马   /  2014-2-21 22:34  /  1243 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Single{
  2.           private static Single s = null;
  3.           private Single(){}
  4.           public static Single getInstance(){
  5.          return s;
  6.           }
复制代码
今天面试一紧张把懒汉是说成了饿汉式!现在想起才知道那会美女老师在笑什么了!囧呀~~

不过我想起一个问题!就是懒汉式的多线程问题~会发生错误的!~为什么呢?加入线程同步不就好了么?可是一个同学说这样只答对了一半!为啥

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

5 个回复

正序浏览
懒汉式多线程的时候会出现不同线程操作的不是一个对象的问题是因为:
如果当一个线程判断该对象没有被new后,恰巧失去了cpu资源,由running状态进入runnable状态,
而不巧这时候另一个线程运行了这段代码,并new了一个对象,
之后该线程又再次获得cpu资源,由于已经判断过了,就不再判断直接new,这样就会出现多个对象,单例失效
使用线程同步,将判断过程和new过程同步在一起,就不会出现以上问题,
可以解决这个问题,但这样并不完美,因为每次代码运行到这里都要同步一下,代价很高
加一个if语句,进行双重判断,实际上是判断是否需要同步一下,可以有效减少同步次数,提高效率

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
额!其实我是想到了安全问题!也想到了双重判定~不过后面突然转不过来了!!惭愧···

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
参考附件,不谢。

QQ截图20140221231658.png (23.44 KB, 下载次数: 18)

QQ截图20140221231658.png

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 松涛小玮 于 2014-2-21 23:22 编辑

同步代码块的进一步改进  用双重判断来提高效率


class Single
{
        private static Single s= null; //注意此处 不可以加final来修饰 因为此处s指向是空 如果是final修饰的话表示最终指向空 是不可以的
        private Single(){}
        public static  Single getIntance(){
                if(s==null){
                        synchronized(Single.class){  //此处是静态函数 所以用class
                        if (s ==null)
                                s=new Single();
                        }
                }
                return s;
        }
}
不知道是不是这个了

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
其他这个问题老毕讲过,如果你学习的时候记过笔记,可以去看看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马