java - 这两种单例实现有什么区别呢?

标签 java c# singleton

我无法理解这两个函数之间的区别。他们不是都实现了单例吗?如果是这样,彼此之间有什么好处。

    private static GameManager instance = new GameManager();
    public static GameManager get(){return instance;}

和波纹管,

    private static GameManager _instance;

    public static GameManager instance(){
     if(_instance == null) _instance = new GameManager();
     return _instance;
    }

最佳答案

主要有两个区别:

  1. 第一个例子是“急”,第二个是“懒”。具体来说,第一个会在单例类初始化时创建单例对象,而第二个会在第一次调用instance()时创建单例对象。

    一般来说,eager 初始化更简单。但是,初始化可能取决于其他事物,而惰性初始化提供了一种将初始化推迟到它们发生之前的方法。

  2. 如果两个或多个线程可以同时调用 instance(),则第二个示例有一个潜在的问题。具体来说,这两个线程可能获得不同的 GameManager 对象。

    第一个示例中的类似问题是,如果应用程序中的类初始化周期存在问题,一个线程可能会看到一个 null。这可能会导致一个线程看到一个 null 值。但是,类初始化的语义意味着在类初始化和调用已初始化类的方法之间存在发生在之间的关系。因此,保证两个线程都能看到 GameManager 对象的正确初始状态。


但请注意,“双重检查锁”示例仅适用于 Java 5 及更高版本。


如果有多个线程共享 GameManager 实例,很可能需要做其他事情来让应用程序(始终)正确运行。

关于java - 这两种单例实现有什么区别呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44611873/

相关文章:

c# - Static Class是引用类型还是值类型?

c# - 在 .NET C# 中获取 DSLR 的驱动器信息

c# - 如何实现 Singleton,它在 C# 中从 db 填充其值?

language-agnostic - 传入应该知道的参数不就隐式违反了封装吗?

java - 找不到类 'kotlin.jvm.internal.DefaultConstructorMarker'

java - 如何获取特定区域的特定格式的当前时间?

java - 由于 jpct 游戏引擎中未捕获的异常,主线程退出

java - java中从字符串中获取元素的快速方法

c# - 仅 WPF TabItem 标题样式

用于深层次继承的 C++ 模板单例基类