23-使用延迟初始化预防问题
11.8 使用延迟初始化预防问题
延迟初始化 是一种常见的编程技术,延迟对象的创建,直到第一次被使用。这会导致对象的初始化发生在具体操作的实现中,而不是在类的构造器中。这种技术的主要优点是节省内存,因为对象仅在需要时才创建。可以在一个类中声明大量的对象,但不是全部对象在每次执行时都需要。因此,应用程序也不会占用这些执行时未用对象所需的内存。这对于在有限的资源环境中运行程序是非常有用的。
不过相比之下,这种技术的性能却不太好,因为直到第一次使用对象时才会创建。
在并发应用程序中使用这种技术时,也会引发一些问题。由于多个线程能同时执行同一个操作,所以它们可能会同时创建一个对象,这就导致了问题。这一点对于 单例 类来说尤其重要。虽然应用程序中的单例类只能有一个实例对象,但是,并发程序可能会错误地创建多个。请看如下代码:
public static DBConnection getConnection(){
if (connection==null) {
connection=new DBConnection();
}
return connection;
}
这是单例类中的典型方法,使用延迟初始化技术获取了该类在应用中唯一存在的对象。如果对象还没有创建,那么就创建它,然后返回。
如果有两个或多个线程在同时执行第一条比较语句( connection == null
),那么它们最终都会创建 Connection
对象。这不是我们期待的结果。
本节将实现一种优雅地解决延迟初始化问题的方案。