在Java中使用非单例的单例时的性能影响?

时间:2011-06-07 10:20:18

标签: java

假设有几个类同时调用单例类中定义的服务方法。

有人可以向我解释当一个方法在类中的其他某个实例已被执行时,在单例中调用方法时在低级别会发生什么?我认为JVM会阻止调用者,直到当前调用者完成该方法。这是对的吗?

如果我们移动singleton类中的一些方法在需要这些方法的类中定义它们,它会改善性能吗?

如果将singleton更改为非单例,允许类的每个实例需要调用另一个类中的服务方法来创建自己的服务类实例,它会提高性能吗?

当然假设单身人士是无国籍的。

考虑多个线程在单例中调用服务方法的情况。

4 个答案:

答案 0 :(得分:4)

通常,服务对象是单例并且是无状态的。所以对它没有影响。如果你有多个对象而不是每个类一个,那么我认为它会更多地填满堆。

答案 1 :(得分:3)

单例只是对类可以拥有的实例数量的约束。 Singleton在JVM或计算机的CPU中没有特定的支持或不同的行为。

  

有人可以向我解释当一个方法在类中的其他某个实例已经被执行时,在单例中调用方法时会发生什么?

没什么特别的。

  

如果我们移动singleton类中的一些方法在需要这些方法的类中定义它们,它会改善性能吗?

不,但是,从Singleton中移出代码可能会提高Singleton的可读性。如果它使代码更清晰,那就值得做。

答案 2 :(得分:3)

  

有人可以向我解释一下方法时在低级别会发生什么   当该方法已被执行时,在单例中调用   该类的其他一些实例?我在想JVM会阻止   调用者直到当前调用者完成该方法。这是   正确?

答案:JVM不会自动同步访问单例对象的方法,如果这是你在这里假设的那样。这与单例的一种使用冲突,让许多线程执行一个方法而不为每个想要执行该方法的新线程实例化对象。


  

如果我们移动一些方法,它会提高性能吗?   singleton类在需要这些方法的类中定义它们吗?

答案:不,只有当此方法以任何方式修改单例或非单例类的实例变量时,才能将方法从单例移动到新的非单例类。否则让它在单例类中。如果你移动它,使用它的类必须以非单例方式调用它。导致不必要的对象创建。

答案 3 :(得分:2)

正如Peter Lawrey和Jigar Joshi已经指出的那样,单身对象并没有什么特别之处,如果它确实无国籍,那么就没有什么可担心的了。如果它具有状态,那么您需要确保方法是线程安全的,例如通过使用同步。如果您的方法是synchronized,则进一步调用将确实阻塞,直到第一个完成,否则不会发生这种情况。我推荐“Java Concurrency in Practice”作为在Java中编写多线程代码的一个很好的介绍。

至于性能,对于可以由多个线程同时访问的无状态单例,没有优势(以及一些额外的开销)来构造多个对象。一般来说,我会首先关注设计的清晰度,然后测量性能,如果出现问题,可能会尝试不同的结构。