【问题标题】:Lazy Singleton what advantages over thread safe one惰性单例与线程安全相比有什么优势
【发布时间】:2016-05-23 22:06:54
【问题描述】:

我们在学校学习过设计模式,并像这样学习了单例(惰性/非线程安全的)的实现:

package com.crunchify.tutorials;
public class CrunchifySingleton {

    private static CrunchifySingleton instance = null;

    protected CrunchifySingleton() {
    }

    // Lazy Initialization (If required then only)
    public static CrunchifySingleton getInstance() {
        if (instance == null) {
            // Thread Safe. Might be costly operation in some case
            synchronized (CrunchifySingleton.class) {
                if (instance == null) {
                    instance = new CrunchifySingleton();
                }
            }
        }
        return instance;
    }
}

现在我找到了这样的实现:

package com.crunchify.tutorials;

public class ThreadSafeSingleton {

    private static final Object instance = new Object();

    private ThreadSafeSingleton() {
    }

    // Runtime initialization
    // By defualt ThreadSafe
    public static Object getInstance() {
        return instance;
    }
}

现在我想知道第一个实现何时更有意义,因为根据http://crunchify.com/thread-safe-and-a-fast-singleton-implementation-in-java/,第二个实现是线程安全的并且需要更少的行。

【问题讨论】:

  • 是的,但是第二个并不懒。
  • @Kayaman 当单例是惰性的并且不是线程安全的时有什么优势?那是我没有得到的。谢谢你的回答!
  • 真正需要单例的次数很少;您实际需要延迟初始化的惰性单例的次数再次变少了。
  • “当单例是惰性的并且不是线程安全的时候有什么好处?”当您想要程序中的可变全局状态和竞争条件时,这是一个优势。你知道,当可预测的行为还不够令人兴奋时。
  • 这个以前经常讨论。例如这里stackoverflow.com/questions/70689/…

标签: java design-patterns


【解决方案1】:

区别在于实例化单例对象的时间。第二个 sn-p 在类实例化时只实例化单例对象一次。如果此过程不需要其他数据,这很有用。请注意,如果发生实例化错误(在那个简单的情况下无关紧要:只是 Object),单例类将根本不可用。

首先 sn-p 在请求时实例化单例对象。您可以修改该类以提供某种机制来存储任何初始化数据和/或捕获实例化错误。

【讨论】:

    【解决方案2】:

    如何防止由于任何原因而出现多个单例实例。 Singleton 的双重检查锁定是一种确保在应用程序生命周期中只创建一个 Singleton 类实例的方法。顾名思义,在双重检查锁定中,代码会在有和没有锁定的情况下对 Singleton 类的现有实例进行两次检查,以确保创建的单例实例不超过一个。

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2016-07-04
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 2017-05-15
      相关资源
      最近更新 更多