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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jlq 中级黑马   /  2015-11-5 23:27  /  312 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

单例设计模式:一种有两种:懒汉式和饿汉式。
示例:
//单例设计模式
//恶汉式
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 ;
    }
}
用双重判断解决低效,提高了懒汉式的效率
**************所以使用的时候,选择饿汉式比较方便,比好好。***************

2 个回复

正序浏览
石三伢子1 发表于 2015-11-6 12:58
Single1.class,一直不明白这是什么,烦请大神解释一下;

字节码文件,就是java源程序编译之后的机器认识的二进制文件,就是类名.class  俗称class文件或字节码文件,JVM运行时加载这个文件,主要用用在反射那一块
回复 使用道具 举报
Single1.class,一直不明白这是什么,烦请大神解释一下;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马