黑马程序员技术交流社区

标题: 关于懒汉式多线程的问题! [打印本页]

作者: 白_蓝(八公)    时间: 2014-2-21 22:34
标题: 关于懒汉式多线程的问题!
  1. class Single{
  2.           private static Single s = null;
  3.           private Single(){}
  4.           public static Single getInstance(){
  5.          return s;
  6.           }
复制代码
今天面试一紧张把懒汉是说成了饿汉式!现在想起才知道那会美女老师在笑什么了!囧呀~~

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

作者: (0.0)’    时间: 2014-2-21 23:03
其他这个问题老毕讲过,如果你学习的时候记过笔记,可以去看看
作者: 松涛小玮    时间: 2014-2-21 23:17
本帖最后由 松涛小玮 于 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;
        }
}
不知道是不是这个了
作者: KeepCoding    时间: 2014-2-21 23:18
参考附件,不谢。

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

QQ截图20140221231658.png

作者: 白_蓝(八公)    时间: 2014-2-22 01:58
额!其实我是想到了安全问题!也想到了双重判定~不过后面突然转不过来了!!惭愧···
作者: 徐芾清    时间: 2014-2-22 10:20
懒汉式多线程的时候会出现不同线程操作的不是一个对象的问题是因为:
如果当一个线程判断该对象没有被new后,恰巧失去了cpu资源,由running状态进入runnable状态,
而不巧这时候另一个线程运行了这段代码,并new了一个对象,
之后该线程又再次获得cpu资源,由于已经判断过了,就不再判断直接new,这样就会出现多个对象,单例失效
使用线程同步,将判断过程和new过程同步在一起,就不会出现以上问题,
可以解决这个问题,但这样并不完美,因为每次代码运行到这里都要同步一下,代价很高
加一个if语句,进行双重判断,实际上是判断是否需要同步一下,可以有效减少同步次数,提高效率




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