黑马程序员技术交流社区

标题: s设置为null和后来判断是否为null的的原因求详解 [打印本页]

作者: 马伟恒    时间: 2012-4-19 16:05
标题: s设置为null和后来判断是否为null的的原因求详解
class Single
{
        private static Single s = null;
        private Single(){}
        public static Single getInstance()
        {
                if(s==null)
                        s = new Single();
                return s;
        }
}

作者: 张超超    时间: 2012-4-19 16:28
你这个涉及到线程安全的问题,这个好像是单例设计模式。
private static Single s = null;这个设置成null是声明这么一个变量但是他不指向任何值。
  if(s==null)这里判断s==null是在多线程运行模式中,能够确保s是没有指向任何值的,是为了线程安全
然后才可以继续赋值: s = new Single();


作者: 蒋亮    时间: 2012-4-19 16:38
这是单例模式的通用代码啊,s设置为null和后来判断是否为null是为了保证在内存中只有一个实例
作者: 邵中国    时间: 2012-4-19 17:14

懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
对于所谓的懒汉式最好用双锁,不要把同步加在方法上,非常影响性能,因为单例方法往往会用得非常平凡,同步会带来很大的性能损耗。
private Singleton() {}

private static Singleton s = null;


public static Singleton getInstance() {
  synchronized(Singleton.class){
//线程的同步代码块(加的锁是Singleton类的字节码)
   if(s == null){
    s = new Singleton();
   }
   return s;
  }
}






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