黑马程序员技术交流社区

标题: 多线程中单例设计模式问题: [打印本页]

作者: jlq    时间: 2015-11-5 23:27
标题: 多线程中单例设计模式问题:
单例设计模式:一种有两种:懒汉式和饿汉式。
示例:
//单例设计模式
//恶汉式
class Single{
    private static final Single s=new Single();
    private Single(){}
    public static Single getInstance(){
          return s ;
    }
}
//懒汉式也被称为延迟加载
class Single1{
    private static Single1 s= null;
    private Single1(){}
    public static Single1 getInstance(){
          if(s ==null)
                //---->A----->B多线程访问
             s= new Single1();//延迟加载
          return s ;
    }
}
*****如果有多线程对共享数据S进行访问,就会出现安全隐患。
------------------------》加同步解决安全问题。----------------------------------


1)同步函数
//懒汉式
class Single1{
    private static Single1 s =null;
    private Single1(){}
    public static synchronized Single1 getInstance(){//效率低-->同步代码块
          if(s ==null)
             s= new Single1();
          return s ;
    }
}
如果是多线程,为了获得实例,进来的时候都要进行同步锁的判断,就比较低效。因此,懒汉式的方法比较低效。
2)同步代码块
//懒汉式
class Single1{
    private static Single1 s =null;
    private Single1(){}
    public static synchronized Single1 getInstance(){//效率低-->同步代码块
          if(s ==null){
             synchronized(Single1.class ){//对象是:该类所属字节码文件的class
                  if(s ==null)
                      s= new Single1();               
                 }
        }
          return s ;
    }
}
用双重判断解决低效,提高了懒汉式的效率
**************所以使用的时候,选择饿汉式比较方便,比好好。***************


作者: 石三伢子1    时间: 2015-11-6 12:58
Single1.class,一直不明白这是什么,烦请大神解释一下;
作者: 大自然的搬运工    时间: 2015-11-6 14:52
石三伢子1 发表于 2015-11-6 12:58
Single1.class,一直不明白这是什么,烦请大神解释一下;

字节码文件,就是java源程序编译之后的机器认识的二进制文件,就是类名.class  俗称class文件或字节码文件,JVM运行时加载这个文件,主要用用在反射那一块




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