Java 程序演示非线程安全的懒惰初始化

2024 年 9 月 10 日 | 阅读 3 分钟

在 Java 中,懒汉式初始化是一种技术,即对象在首次需要时才被创建。使用这种方法对于创建成本高昂或可能永远不需要的对象非常有利。然而,在多线程应用程序中,懒汉式初始化可能会导致问题。这是因为多个线程可能同时尝试访问该对象,如果该对象不是线程安全的,这可能导致数据损坏。

方法:懒汉式初始化(非线程安全)

该代码使用 volatile 关键字使实例变量线程安全。volatile 关键字确保每个线程都能看到实例变量的最新值。synchronized 关键字用于在调用 getInstance() 方法时锁定 Singleton.class 对象。它确保一次只有一个线程可以使用 getInstance() 方法。

算法

  1. 定义一个具有私有静态实例变量的 Singleton 类。
  2. 为 Singleton 类实现私有构造函数,以防止直接实例化。
  3. Singleton 类应包含一个 getInstance() 方法。
    • 验证实例是否为 null。
    • 如果实例为 null,则创建一个新实例并将其赋值给实例。
    • 返回实例。
  4. 在 Singleton 类中实现 displayMessage() 方法以打印消息。
  5. 创建一个带有 main() 方法的 LazyInitialization 类。
  6. 在 main() 方法内
    • 创建三个线程 t1、t2 和 t3。
    • 每个线程的 run() 方法调用 getInstance() 和 displayMessage() 方法。
    • 开始所有三个线程的执行。
  7. 结束程序执行。

注意:该代码演示了懒汉式初始化非线程安全的方法,其中多个线程可能创建单例类的多个实例。

实施

文件名: LazyInitialization.java

输出

Singleton object created
Lazy Initialized Singleton
Singleton object created
Lazy Initialized Singleton
Singleton object created
Lazy Initialized Singleton

解释: 使用双重检查锁定模式可以使 getInstance() 方法更高效。该模式避免了每次调用 getInstance() 方法时都要加锁的开销。可以通过将 Singleton 类设为抽象类来使其更具可重用性。这将允许其他类扩展 Singleton 类并继承其懒汉式初始化行为。可以通过提供一种方法让子类自定义 getInstance() 方法来使 Singleton 类更具可扩展性。这将允许子类控制 Singleton 对象的创建方式。