当前位置:嗨网首页>书籍在线阅读

23-使用延迟初始化预防问题

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

11.8 使用延迟初始化预防问题

延迟初始化 是一种常见的编程技术,延迟对象的创建,直到第一次被使用。这会导致对象的初始化发生在具体操作的实现中,而不是在类的构造器中。这种技术的主要优点是节省内存,因为对象仅在需要时才创建。可以在一个类中声明大量的对象,但不是全部对象在每次执行时都需要。因此,应用程序也不会占用这些执行时未用对象所需的内存。这对于在有限的资源环境中运行程序是非常有用的。

不过相比之下,这种技术的性能却不太好,因为直到第一次使用对象时才会创建。

在并发应用程序中使用这种技术时,也会引发一些问题。由于多个线程能同时执行同一个操作,所以它们可能会同时创建一个对象,这就导致了问题。这一点对于 单例 类来说尤其重要。虽然应用程序中的单例类只能有一个实例对象,但是,并发程序可能会错误地创建多个。请看如下代码:

public static DBConnection getConnection(){
  if (connection==null) {
    connection=new DBConnection();
  }
  return connection;
}

这是单例类中的典型方法,使用延迟初始化技术获取了该类在应用中唯一存在的对象。如果对象还没有创建,那么就创建它,然后返回。

如果有两个或多个线程在同时执行第一条比较语句( connection == null ),那么它们最终都会创建 Connection 对象。这不是我们期待的结果。

本节将实现一种优雅地解决延迟初始化问题的方案。