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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ☆╰學不会☆╮ 中级黑马   /  2013-10-23 20:39  /  1194 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ☆╰學不会☆╮ 于 2013-10-24 08:00 编辑

单例模式挺容易听懂的 但是就是延迟加载 懒汉式的单例。synchronized不是很理解。
public class SingerDemo {
// 私有的构造方法
  private SingerDemo() {}
//静态私有的成员变量
  private static SingerDemo instance = null;
  public static SingerDemo getInstance() {
       if (instance == null) {
            synchronized (SingerDemo.class) {
             if (null == instance) {
                  instance = new SingerDemo();
             }
        }
   }
   return instance;
}
}
谁能给解释一下 synchronized 跟多线程中的作用一样吗。
是不是 不加synchronized会导致对线程的访问不安全?
还有就是 两个if的作用?  谢了。。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

2 个回复

倒序浏览

synchronized 英语释义为:同步的。
多线程中,多个线程同时工作,如果几个线程操作同一个数据资源,由于cpu的执行的随机性特点,会使同一个数据被操作多次,给数据的操作但来安全隐患。
这是就需要对线程的操作进行同步,使每一次只能有一个线程在操作数据资源,从而保证结果的可靠性。因此线程的同步在JDK1.5之前就需要用到同步代码块
或者同步函数,单例设计里面用到的就是同步代码块,就是为了保证多线程下结果的唯一性和可靠性,所以synchronized在此作用是一样的。

由于语句中synchronized的加入使得每次线程进入代码块之前都要进行判断,该判断比较麻烦比较耗费CPU资源,使执行效率降低,为了较少同步代码块的判断次数
加入了第一个if (instance == null),即如果对象已经建立便不再进入内部去判断同步中的“锁”。把复杂的判断变为简单的判断,提高CPU执行效率。
第二个if (null == instance) 是判断对象有没有建立,没有的话就执行new SingerDemo();建立对象。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
public class SingerDemo {
// 私有的构造方法
  private SingerDemo() {}
//静态私有的成员变量
  private static SingerDemo instance = null;
  public static SingerDemo getInstance() {
      //判断第一次是否为空,如果已经创建有对象,就可以跳过同步,提高效率
       if (instance == null) {
            synchronized (SingerDemo.class) {
             if (null == instance) {
                  //加同步是怕多线程操作时,某一线程读到这一步挂掉,导致多个线程已经判断过instance是null.结果就会导致会创建两个或多个新的对象
                  instance = new SingerDemo();
             }
        }
   }
   return instance;
}
}

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马