我无法理解这两个函数之间的区别。他们不是都实现了单例吗?如果是这样,彼此之间有什么好处。
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;
}
最佳答案
主要有两个区别:
第一个例子是“急”,第二个是“懒”。具体来说,第一个会在单例类初始化时创建单例对象,而第二个会在第一次调用
instance()
时创建单例对象。一般来说,eager 初始化更简单。但是,初始化可能取决于其他事物,而惰性初始化提供了一种将初始化推迟到它们发生之前的方法。
如果两个或多个线程可以同时调用
instance()
,则第二个示例有一个潜在的问题。具体来说,这两个线程可能获得不同的GameManager
对象。第一个示例中的类似问题是,如果应用程序中的类初始化周期存在问题,一个线程可能会看到一个
null
。这可能会导致一个线程看到一个null
值。但是,类初始化的语义意味着在类初始化和调用已初始化类的方法之间存在发生在之间的关系。因此,保证两个线程都能看到GameManager
对象的正确初始状态。
但请注意,“双重检查锁”示例仅适用于 Java 5 及更高版本。
如果有多个线程共享 GameManager
实例,很可能需要做其他事情来让应用程序(始终)正确运行。
关于java - 这两种单例实现有什么区别呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44611873/