java - 2 关于单例模式/渴望初始化和同步

标签 java synchronization singleton lazy-loading eager-loading

(来自维基百科)

//惰性初始化:

public class Singleton {

    private static volatile Singleton instance = null;

    private Singleton() {   }

    public static Singleton getInstance() {
            if (instance == null) {
                    synchronized (Singleton.class){
                            if (instance == null) {
                                    instance = new Singleton();
                            }
                  }
            }
            return instance;
    }
}

//热切初始化:

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

   private Singleton() {}

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

“如果程序使用类,但可能不是单例实例本身,那么您可能需要切换到惰性初始化。”

1 - 不确定我明白了。为什么程序不应该使用类?为什么我不能通过添加属性/方法来解决它?常量引用应该如何改变?

2 - 在惰性初始化中 - 假设多线程发生,同步 getInstance() 而不是代码块(摆脱双重检查)将如何影响我的程序?

谢谢。

最佳答案

1 - 您的应用程序可能包含各种 jar,但您不一定会使用每个 jar 中的所有功能。此外,您的应用程序的用户可能不会使用您内置的所有功能。例如,如果您有一个 ReportABug 类,他们可能永远不会从菜单中激活该功能,因为您是一个非常棒的程序员 ;-)

静态字段/方法在运行时需要该类之前不会被实例化/调用,因此您的 ReportABug 类可能有 1000 个静态字段,但祈祷吧,它们永远不会消耗任何内存,因为该类永远不会被加载。

他们的观点是具有单例(或多个)的类可能具有其他不访问单例的静态方法。

2 - 您可以将方法与 Singleton 类对象同步,但每次调用 getInstance 都会产生开销,仅检查 instance == null(这是一个机器周期)要便宜得多。另一个线程可能会抢占您的线程并在外部 ==null 检查后创建实例,因此这两个测试都是必需的。

关于java - 2 关于单例模式/渴望初始化和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921878/

相关文章:

Scala - 组织单例对象层次结构的正确方法是什么?

java - Android 应用程序因 SQL 查询而崩溃

java - 添加第三个项目后临时数组不起作用

java - Java方法中的双重初始化意味着什么

c - 同步进程的文件输出写入顺序错误?

java - 无需身份验证即可从 Dropbox 链接获取元数据

meteor - 如何使 Meteor 方法同步?

sql - 无法在我的系统上使用单例中的作用域服务 - 但在 azure 上它可以工作(全部在 net 5 中)

java - java 如何确保每个 JVM 只有一个枚举实例

Java – “Error: Could not find or load main class” 错误