加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_沈阳站长网 (https://www.024zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Java关于延迟加载的 一些应用施行

发布时间:2022-12-09 11:19:54 所属栏目:语言 来源:
导读:  一般有几种延迟初始化的场景:

   对于会消耗较多资源的对象:这不仅能够节省一些资源,同时也能够加快对象的创建速度,从而从整体上提升性能。

   某些数据在启动时无法获取:比如一些上下文信息可
  一般有几种延迟初始化的场景:
 
   对于会消耗较多资源的对象:这不仅能够节省一些资源,同时也能够加快对象的创建速度,从而从整体上提升性能。
 
   某些数据在启动时无法获取:比如一些上下文信息可能在其他拦截器或处理中才能被设置,导致当前bean在加载的时候可能获取不到对应的变量的值,使用 延迟初始化可以在真正调用的时候去获取,通过延迟来保证数据的有效性。
 
  在Java8中引入的lambda对于我们实现延迟操作提供很大的便捷性,如Stream、Supplier等,下面介绍几个例子。
 
  Lambda
 
  Supplier
 
  通过调用get()方法来实现具体对象的计算和生成并返回,而不是在定义Supplier的时候计算,从而达到了_延迟初始化_的目的。但是在使用 中往往需要考虑并发的问题,即防止多次被实例化,就像Spring的@Lazy注解一样。
 
  public class Holder {  
 
      // 默认第一次调用heavy.get()时触发的同步方法  
 
      private Supplier<Heavy> heavy = () -> createAndCacheHeavy();   
 
      public Holder() {  
 
          System.out.println("Holder created");  
 
      }  
 
      public Heavy getHeavy() {  
 
          // 第一次调用后heavy已经指向了新的instance,所以后续不再执行synchronized  
 
          return heavy.get();   
 
      }
 
      //...  
 
      private synchronized Heavy createAndCacheHeavy() {  
 
          // 方法内定义class,注意和类内的嵌套class在加载时的区别  
 
          class HeavyFactory implements Supplier<Heavy> {  
 
              // 饥渴初始化  
 
              private final Heavy heavyInstance = new Heavy();   
 
              public Heavy get() {  
 
                  // 每次返回固定的值
 
                  return heavyInstance;   
 
              }   
 
          }       
 
          //第一次调用方法来会将heavy重定向到新的Supplier实例  
 
          if(!HeavyFactory.class.isInstance(heavy)) {  
 
              heavy = new HeavyFactory();  
 
          }  
 
          return heavy.get();  
 
      }  
 
  }
 
  当Holder的实例被创建时,其中的Heavy实例还没有被创建。下面我们假设有三个线程会调用getHeavy方法,其中前两个线程会同时调用,而第三个线程会在稍晚的时候调用。
 
  当前两个线程调用该方法的时候,都会调用到createAndCacheHeavy方法,由于这个方法是同步的。因此第一个线程进入方法体,第二个线程开始等待。在方法体中会首先判断当前的heavy是否是HeavyInstance的一个实例。
 
  如果不是,就会将heavy对象替换成HeavyFactory类型的实例。显然,第一个线程执行判断的时候,heavy对象还只是一个Supplier的实例,所以heavy会被替换成为HeavyFactory的实例,此时heavy实例会被真正的实例化。
 

(编辑:我爱制作网_沈阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!