黑马程序员技术交流社区

标题: 延迟加载 [打印本页]

作者: luoanjade    时间: 2014-2-16 16:33
标题: 延迟加载
请问一下,延迟加载是什么意思?如何实现?请帮我详细分析一下,谢谢!!!
作者: tangxiaobo1991    时间: 2014-2-16 16:49
延时加载就是懒汉式的单例设计模式。就是当类加载时并不创立对象,对象的指引指向null,只有当调用函数时才会在栈内存中加载对象,程序如下:
class Single
{
private Single(){}
private Single s=null;//没有调用getInstence()时,s指向空。
public static Single getInstence()
{
if(s==null)
return s=new Single;

}

}
作者: luoanjade    时间: 2014-2-16 21:45
tangxiaobo1991 发表于 2014-2-16 16:49
延时加载就是懒汉式的单例设计模式。就是当类加载时并不创立对象,对象的指引指向null,只有当调用函数时才 ...

也就是说,延时加载说的就是单例设计模式?
作者: skyname    时间: 2014-2-16 21:56
延迟加载,也叫延迟实例化,延迟初始化等,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。把对象的创建延迟到应用时创建,而不是在对象实例化时就创建。
例如:
Class Singleton
{
      private static Singleton instance;
      private Singleton()
      { }
      public static Singleton getInstance()
      {
         If(instance==null)
         {
               Instance=new Singleton();
         }
         Return instance;
      }
}
单例设计模式中的懒汉式采用的就是延迟加载的方式,在方法被掉时才创建对象
class Single
{
    private Single(){}
    private  static  Single s=null;
    public static Single getInstence()
    {
           if(s==null)
           return s=new Single;//对象是方法被调用时才初始化的,也叫做对象的延时加载
    }
}
与它相对应的饿汉式却是先初始化对象:
class Single
{
    private Single(){}
    private  static  Single s=new Single(); //Single类一进内存就已经创建好了对象
    public static Single getInstence()
     {
             return  s;
     }
}




作者: lgqioi    时间: 2014-2-16 23:02
class Single{
  private static Single s = null;
  private Single(){ }
  public static Single getInstance(){
    if(s==null){
      synchronized(Single.class){
        if(s==null)
        s = new Single();
      }
    }
    return s;
  }

对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。
延时加载:Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。

作者: kkopopo    时间: 2014-2-17 00:36
延迟加载和JAVA没关系。 很多地方都用得到。

主要是为了加快某些过程,让用户等待时间稍微短一些。 比如浏览器一般先加载文本,显示出来以后再加载图片。 这样用户不至于等到所有东西都下载完成以后再显示给用户。

在某些领域,比如软件开发来讲,延迟加载使用合理可以避免CPU和内存高峰。

自己写一个延迟加载程序
for(int i=0;i<100;i++){
    //这也叫延迟,
}
作者: jkenny    时间: 2014-2-17 01:56
luoanjade 发表于 2014-2-16 21:45
也就是说,延时加载说的就是单例设计模式?

好了延迟加载上面已经回答很多了,这我就不在说了。
你第二个问的(延时加载说的就是单例设计模式?)
这样说就错了,延时加载可以应用的方面很多,可不是就单指单例设计模式,只不过是,在你提问的单例设计模式中用到了而已。
还有就是因为我们用的是分时操作系统,所以如果你在但设计单例设计模式时,如果不使用加(synchronized)的懒汉式的话,还是使用 饿汉式 就可以了,因为比较安全。
简单的饿汉式:
class Single
{
        private static final Single onlyone=new Single();
        public static getSingle()
        {
                return onlyone;
        }
}
作者: →★稻草人☆    时间: 2014-2-17 08:27
这里有两个单例设计模式:
饿汉式:Single类一进内存就会给它创建一个对象S.
class Single
{
private  static  Single s=new Single();
    private Single(){}
    public static Single getInstence()
     {
             return  s;
     }
}
懒汉式:类在进内时,对象S为null,没有给它创建对象,只有在调用getInstence()方式才会创建对象,这就叫延迟加载。
class Single
{
    private Single(){}
    private  static  Single s=null;
    public static Single getInstence()
    {
           if(s==null)
           return s=new Single;
    }
}
以上这个是最简单的懒汉式,但在学到多线程时就会发现当用多线程去执行这个代码时,有可能会发生安全问题,还需进行优化。但刚开始我们只要能把这两种方式的区别以及思想理解了就可以了。



作者: tangxiaobo1991    时间: 2014-2-17 11:12
luoanjade 发表于 2014-2-16 21:45
也就是说,延时加载说的就是单例设计模式?

这只是一个最容易懂得实例而已
作者: luoanjade    时间: 2014-2-17 20:38
非常感谢大家的解答,看了大家的解答,我终于理解了。非常感谢!




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