我想知道枚举中的单例及其性能。
当我们拥有多线程环境时,我们必须在创建实例时同步时刻。
简单地说,我们可以使用 synchronized mod,用于创建实例的名为 getInstance() 的函数 像这样的想法:
public synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
这是一种懒惰的实现,对我来说很好。但是同步方法很慢。 我们可以使用双锁来让它更快。
枚举怎么样? 当我们将单例实现为枚举时,单例实例将在首次使用时创建。下次使用,返回当前实例。
它是如何工作的? 当我们想要获取现有实例时,隐式同步方法很慢?还是实现了双锁?
最佳答案
Enum 是线程安全的,也是 the recommended way实现单例。
也就是说,枚举不是延迟加载的。如果你想要一个延迟加载的单例,你可以使用 Holder pattern (这也是线程安全的):
class LazySingleton {
private LazySingleton() {}
private static class SingletonHelper{
private static final LazySingleton INSTANCE = new LazySingleton();
}
public static LazySingleton getInstance(){
return SingletonHelper.INSTANCE;
}
}
关于java - 枚举性能中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47502406/