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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯国强 中级黑马   /  2013-10-24 17:58  /  1487 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

延迟加载的单例设计模式?

评分

参与人数 1黑马币 +3 收起 理由
李江 + 3 赞一个!

查看全部评分

9 个回复

倒序浏览
延迟加载,也叫延迟实例化,延迟初始化等,首要表达的思惟就是,把对象的创建延迟到应用的时候创建,而不是对象实例化的时辰创建。这种体式格式避免了机能的浪费。
延迟加载的单例设计模式,也叫做懒汉式单例设计模式,对象在方法调用时才被初始化
但是懒汉式单例设计模式执行效率不高,建议使用饿汉式单例设计模式
  1. class Single
  2. {
  3.                      private it num;
  4.              private Single(){}
  5.                      private static Single s = null;
  6.                      public static Single getInstance()       当调用该方法时,对象才被实例化
  7.       {
  8.                                   if(s==null)
  9.          {
  10.                                                synchronized(Single.class)//给Single类加锁,当一个方法正在操作该类时,不让其他方法对该类进行操作,这样做是为了保证对象的唯一性
  11.                   {                    
  12.                            if(s==null)        
  13.                             s = new Single();
  14.                                               }
  15.          }
  16.          return s;
  17.     }
  18. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
上面的代码有点问题。getInstance()方法中if(p!=null)不正确。如果p != null,那就不需要创建新的对象了,可是上面的代码继续创建新的对象,这就不是单例模式了。
回复 使用道具 举报
延迟加载,也较延迟实例化,延迟初始化等,首要表达的思惟就是,把对象的创建延迟到应用的时辰创建,而不是对象实例化的时辰创建。这种体式格式避免了机能的浪费。
当创建一个对象的子对象开销斗劲大时,并且有可能在法度顶用不到这个子对象,那么久可以推敲用延迟加载的体式格式来创建子对象。别的就是当一个法度启动时,须要创建多个对象,但仅有几个对象须要立即应用,那么可以将一些不须要的初始化工作延迟到应用的时辰。如许可以进步法度的启动速度。

评分

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

查看全部评分

回复 使用道具 举报
是对象为空才锁码?
回复 使用道具 举报
xh396660787 发表于 2013-10-24 18:16
延迟的单例就是懒汉式,调用的时候才会创建对象,所以是延迟加载的。但是延迟加载在多线程中有可能出现创建 ...

你的代码有问题,if(s==null)才对。。。。
回复 使用道具 举报

package cn.ineeke.util;
/**
* 单利模式——懒汉式
*/
public class DB {
    private static DB db = null;
     
    public static DB getInstance(){
        if(db == null){
            db = new DB();
        }
        return db;
    }
}
package cn.ineeke.util;
/**
* 单利模式——饿汉式  
*/
public class DB {
    private static DB db = new DB();
     
    public static DB getInstance(){
        return db;
    }
}
这种静态初始化的方法是自己被加载时就自己实例化,被形象的称之为饿汉式单例类。而原先的单例模式处理方式要在第一次被引用的时候才会被实例化,就被称为懒汉式单例类。
由于在多线程访问时懒汉式可能会出现创建出多个实例,而若对其使用synchronized的话,则又会降低程序性能。所以推荐使用饿汉式

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
枫儿 金牌黑马 2013-10-25 16:02:19
8#
延时加载,即判断条件通过后才new对象进内存
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马