黑马程序员技术交流社区

标题: 延迟加载:懒汉式的疑惑,求讲解 [打印本页]

作者: 过路人    时间: 2015-5-17 02:06
标题: 延迟加载:懒汉式的疑惑,求讲解
/**
* 我觉得为了保证线程安全应该将return s;放入synchronized(){}的大括号内
*/
//懒汉式:延迟加载方式。
class Single {
         // 构造函数私有化
        private Single() {
         }
         // 先不创建对象
        private static Single s = null;
         // 定义一个方法可以获取到该对象
        public static Single getInstance() {
                 // 方法被调用时才判断s是否为null,是否创建对象,起延时作用
                if (s == null)
                         // 双重判断,加synchronized同步解决线程的安全问题
                              //-----ThreadA    与  ThreadB都为null,都在等待进入同步代码块
                        synchronized (Single.class) {
                                        //假如ThreadA先进来了
                                 if (s == null)
                                         // 创建一个本类对象
                                        s = new Single();
                         }    //(1)                //       如果ThreadA顺利执行完同步代码块并走到(1)处进入阻塞状态,而ThreadB进入同步代码块又重新
                                                  //  new 了一个对象,这样有一个Thread不是做了无用功么
                 return s;                  
}

///////////////////////////////下面这样写会不会好点
/**
将第二个return放入synchronized (){}中就不会出现重复创建对象的操作,会不会好一点
*/
public class Single {
// 创建静态本类对象
private static Single s = null;
// 私有化构造方法
private Single() {
}
// 定义静态方法,返回本类对象实例
public static Single getInstance() {
  if (s != null) {
   return s;
  }
  synchronized (Single.class) {
   if (s == null) {
    s = new Single();
   }
   return s;
  }
}
}







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