【问题标题】:Java Singleton vs static - is there a real performance benefit?Java Singleton vs static - 有真正的性能优势吗?
【发布时间】:2010-09-06 21:27:17
【问题描述】:

我正在合并一个 CVS 分支,其中一个较大的变化是用具有静态初始化块和所有静态方法的抽象类替换单例模式。

这是值得保留的东西,因为它需要合并很多冲突,我会在什么样的情况下寻找这种重构是值得的?

我们在 Weblogic 8.1(所以 JDK 1.4.2)下运行这个应用程序


抱歉,Thomas,让我澄清一下..

HEAD 版本具有传统的单例模式(私有构造函数、getInstance() 等)

分支版本没有构造函数,是一个“公共抽象类”,并将对象上的所有方法都修改为“静态”。以前存在于私有构造函数中的代码被移动到一个静态块中。

然后该类的所有用法都被更改,从而导致合并中的多个冲突。

在少数情况下进行了此更改。

【问题讨论】:

    标签: java design-patterns singleton


    【解决方案1】:

    这个讨论有帮助吗? (我不知道链接到另一个编程论坛是否禁忌,但我宁愿不只是引用整个讨论=))

    Sun Discussion on this subject

    结论似乎是,在大多数情况下,它并没有产生足够的影响,尽管从技术上讲静态方法更有效。

    【讨论】:

      【解决方案2】:

      从严格的运行时性能角度来看,差异确实可以忽略不计。两者之间的主要区别在于“静态”生命周期与类加载器相关联,而对于单例来说,它是一个常规的实例生命周期。通常最好远离 ClassLoader 业务,这样可以避免一些棘手的问题,尤其是在尝试重新加载 Web 应用程序时。

      【讨论】:

      • 单例与加载它的类加载器的 ClassLoader 生命周期相关联,就像静态一样。
      • 然后呢?一切都与 ClassLoader 的生命周期相关,但是通过放置一个单例,您可以获得一个额外的生命周期层,从而有更多机会(最终确定)正确处理事情。
      【解决方案3】:

      如果我的原始帖子是正确的理解,并且与之相关的 Sun 的讨论是准确的(我认为可能是准确的),那么我认为您必须在清晰度和性能之间做出权衡。

      问自己这些问题:

      1. Singleton 对象是否让我正在做的事情更加清晰?
      2. 我需要一个对象来完成这项任务还是更适合静态方法?
      3. 我是否需要不使用 Singleton 可以获得的性能?

      【讨论】:

      • 问题实际上是关于性能提升 :-) 考虑您有一个每秒处理 100 个请求的控制器。这与在单例或作为无状态服务的类之间进行选择有关吗?
      【解决方案4】:

      如果需要存储任何状态,我会使用单例,否则使用静态类。除非需要存储某些东西,否则实例化某些东西(即使是单个实例)也没有意义。

      【讨论】:

        【解决方案5】:

        根据我的经验,唯一重要的是在单元测试中哪个更容易模拟。我一直觉得 Singleton 更容易和自然地模拟出来。如果您的组织允许您使用 JMockit,那没关系,因为您可以克服这些顾虑。

        【讨论】:

          【解决方案6】:

          静态不利于可扩展性,因为静态方法和字段不能被子类扩展或覆盖。

          这对单元测试也很不利。在单元测试中,您不能防止不同测试的副作用溢出,因为您无法控制类加载器。在一个单元测试中初始化的静态字段将在另一个单元测试中可见,或者更糟糕的是,同时运行测试会产生不可预测的结果。

          在谨慎使用时,单例通常是一种不错的模式。我更喜欢使用 DI 框架并让它为我管理我的实例(可能在不同的范围内,如在 Guice 中)。

          【讨论】:

            【解决方案7】:

            编写一些代码来衡量性能。答案将取决于 JVM(Sun 的 JDK 的性能可能与 JRockit 不同)和您的应用程序使用的 VM 标志。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-01-06
              • 1970-01-01
              • 2010-09-12
              • 1970-01-01
              • 2014-11-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多