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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/**
* 我觉得为了保证线程安全应该将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;
  }
}
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马