📅  最后修改于: 2023-12-03 15:28:49.296000             🧑  作者: Mango
这是一道门|门模拟 2017 的第 27 题,题目要求我们实现一个懒加载(lazy initialization)的类,要求能保证线程安全,并且能够在多线程环境中正确的工作。
首先我们需要了解什么是懒加载。懒加载,也叫延迟加载,在程序中应用比较广泛。其核心思想是,将某些耗时操作推迟到使用时再进行,从而提高程序的性能。比如在 Java 中,我们可以使用懒加载来延迟创建对象,这样可以避免在程序启动时就创建对象,而是在第一次使用时再创建。
根据题目要求,我们需要实现一个懒加载的类,并保证线程安全。也就是说,多个线程同时访问这个类时,不会出现竞争条件(race condition)等线程安全问题。
一种常见的实现方式是使用双重检查锁(double-checked locking)。这种方式要点是:先判断对象是否已经被创建了,如果没有,再加锁创建对象。这样能够保证线程安全,并且只在第一次使用时才创建对象,达到了懒加载的效果。
代码片段如下:
public class LazySingleton {
private static volatile LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
这里使用了 volatile
修饰符,确保 instance
在多线程环境中正确的工作。在单例模式中使用双重检查锁也是一种比较常见的写法,它保证了单例的全局唯一性,同时也能够保证线程安全。
本题要求实现一个懒加载的类,并保证线程安全。我们介绍了使用双重检查锁的一种实现方式,这种方式可以避免竞争条件,保证线程安全,并且达到了懒加载的效果。在实际开发中,要注意多线程环境下的线程安全问题,避免出现竞争条件等问题。