关于java中的单例模式,与其在方法中将静态变量分配给新的局部变量,为什么不直接使用静态变量呢?
我还不明白代码的用途=>DataProvider instance=sInstance在下面的方法中。有人帮我详细解释一下吗?为什么不直接使用sInstance关于java中的单例模式,与其在方法中将静态变量分配给新的局部变量,为什么不直接使用静态变量呢?,java,design-patterns,Java,Design Patterns,我还不明白代码的用途=>DataProvider instance=sInstance在下面的方法中。有人帮我详细解释一下吗?为什么不直接使用sInstance private static volatile DataProvider sInstance = null; public static DataProvider getInstance() { DataProvider instance = sInstance; if (instance == null) {
private static volatile DataProvider sInstance = null;
public static DataProvider getInstance() {
DataProvider instance = sInstance;
if (instance == null) {
synchronized (DataProvider.class) {
instance = sInstance;
if (instance == null) {
instance = sInstance = new DataProvider();
}
}
}
return instance;
}
它用作延迟初始化(即,仅在需要时创建单例实例)。这个代码的问题是它被破坏了。显然,即使在使用synchronize块时,也有可能出现问题(由于竞争条件)。所以,如果你想安全,就不要使用这种方法 备选方案: 使用直接赋值(如您所建议的) 或者使用枚举(如@MadProgrammer所建议)
根据Joshua Bloch 2008年5月出版的《Prentice.Hall.Effective.Java.2nd.Edition》一书 特别是,对局部变量结果的需求可能不清楚。 此变量的作用是确保字段在中只读取一次 它已经初始化的常见情况。虽然不严格 必要时,这可能会提高性能,并且通过 应用于低级并发编程的标准。在我的机器上, 上述方法比显而易见的方法快25% 没有局部变量
主要原因是不稳定。正如@Hien Nguyen的回答,它提高了25%的性能。因为Volatile总是从主内存而不是缓存中获取数据,所以速度太慢。Declare instance=sInstance以避免多次(缓慢)从主存读取数据。 如果不使用temp变量,我们有三次从sInstance读取数据,所以使用temp变量将提高性能 请参阅本主题以了解访问速度缓慢的原因:
您的答案可能与本主题相同:为了获得它的价值,您应该使用
enum
而不是从何处获得代码?它看起来太复杂了,只是一个微观优化@它的代码来自telegram@Radiodef请您详细解释一下:(我不知道为什么在使用=>DataProvider instance=sInstance之前需要分配给局部变量;我想知道为什么我们应该分配给局部变量=>DataProvider instance=sInstance;:(请您给我详细解释一下:(
private static volatile DataProvider sInstance = new DataProvider();
public enum DataProvider
{
INSTANCE;
// singleton content
}