gpt4 book ai didi

java - 单例惰性与渴望实例化

转载 作者:IT老高 更新时间:2023-10-28 20:27:48 27 4
gpt4 key购买 nike

如果单例实现如下,

class Singleton {
private static Singleton instance = new Singleton();

public static Singleton getInstance() {
return instance;
}
}

此实现与延迟初始化方法有何不同?在这种情况下,将在加载类时创建实例,并且仅在第一次主动使用时才加载类本身(例如,Singleton.getInstance() 而不是在您声明实例时 Singleton singleton = null;)

即使使用惰性初始化方法,实例也是在调用 getInstance() 时创建的

我错过了什么吗?

最佳答案

通过延迟初始化,您只在需要时创建实例,而不是在加载类时。因此,您可以避免不必要的对象创建。话虽如此,还有其他事情需要考虑。在惰性初始化中,您提供一个公共(public) API 来获取实例。在多线程环境中,避免不必要的对象创建带来了挑战。您放置了造成不必要锁定的同步块(synchronized block),以检查已创建的对象。所以在这种情况下它成为一个性能问题。

因此,如果您确定创建对象不会占用任何大量内存并且它几乎总是会在您的应用程序中使用,那么最好在静态初始化中创建。另外请不要忘记在这种情况下使您的实例成为最终实例,因为它可以确保对象创建正确地反射(reflect)到主内存中,这在多线程环境中很重要。

请引用 tutorial来自 IBM 的 Singleton+ Lazy Loading+ 多线程环境案例

===============编辑于 09/09/2018=====================

您还应该查看按需创建对象模式 here .

关于java - 单例惰性与渴望实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7790185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com