单身访问性能

时间:2017-05-18 05:25:03

标签: java android

每当我想在我的应用程序代码中使用单例模式时,我就会使用类似的代码:

public class Singleton {

    private volatile static Singleton INSTANCE;

    public static synchronized Singleton singleton() {
        if (INSTANCE == null) {
            INSTANCE = new Singleton();
        }
        return INSTANCE;
    }
}

我认为这是非常常见的解决方案,但现在我想知道使用该单例实例的最佳方式是什么,无论是将其用作内联函数:

singleton().doSomething();
singleton().doSomethingElse();

或在每个使用它的类中创建单个字段:

private Singleton mSingleton = singleton(); // Or pass it in constructor

mSingleton.doSomething();
mSingleton.doSomethingElse();

问题

在哪种情况下表现更好?

2 个答案:

答案 0 :(得分:-1)

不要使用Singelton模式!

Singelton 只是一个全局变量,使您的代码不灵活,难以重用并难以测试。

创建Singeltons普通对象,并确保在构造对象树时只有一个实例,方法是传递逻辑singelton的唯一实例或使用依赖注入框架。 / p>

  

你走了一条切线而忘了回答这个问题。 - shmosel

不要为性能选择某种语法!

没有必要为性能原因选择某种语法,尤其是在像Java这样的托管语言中。

JVM将在执行时修改和优化生成的字节代码,甚至可以将其重新编译为机器代码。这使得无法判断某种语法对性能的影响。

即使选择的语法有任何性能影响,它是否可识别?语法的更改只能在分数中改变性能。但是要认识到差异,它会超过50%(当两个版本并行运行时为20%)。

这两个方面都会使语法的性能影响无用。不要考虑性能,除非你遇到*一个问题通过测量验证,所讨论的代码确实是瓶颈。其他任何内容都被视为过早优化

选择您的语法,使其表达您的意图,使您的代码具有最佳可读性。

答案 1 :(得分:-3)

如果Singleton性能会更好,因为如果你多次创建相同的对象来执行相同的任务,它将占用堆中的内存。它消耗堆内存。因此,如果您只使用一个对象来执行任务,那么为什么要创建多个对象。