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

在Java中从非单例使用单例时的性能影响?,java,Java,假设一个类有多个实例同时调用一个单例类中定义的服务方法 有人能向我解释一下,当一个方法在单例中被调用时,当该方法已经被类的其他实例执行时,在底层会发生什么?我认为JVM将阻止调用程序,直到当前调用程序使用该方法完成。是这样吗 如果我们移动singleton类中的一些方法,在需要这些方法的类中定义它们,会提高性能吗 如果将singleton更改为非singleton,允许一个类的每个实例需要调用另一个类中的服务方法来创建自己的服务类实例,那么会提高性能吗 当然,假设singleton是无状态的 考

假设一个类有多个实例同时调用一个单例类中定义的服务方法

有人能向我解释一下,当一个方法在单例中被调用时,当该方法已经被类的其他实例执行时,在底层会发生什么?我认为JVM将阻止调用程序,直到当前调用程序使用该方法完成。是这样吗

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

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

当然,假设singleton是无状态的


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

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

单个对象只是您对一个类可以拥有的实例数量的限制。在JVM或您机器的CPU中,没有特定的支持,也没有单独的行为

有人能向我解释一下,当一个方法在一个单例中被调用时,当该方法已经被该类的其他实例执行时,会发生什么情况吗

没什么特别的

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


不,但将代码移出单例可能会提高单例的可读性。如果它能让代码更清晰,那就值得去做。

正如Peter Lawrey和Jigar Joshi已经指出的那样,单例对象没有什么特别之处,如果它确实是无状态的,那么就没有什么可担心的了。如果它有状态,那么您需要确保这些方法是线程安全的,例如通过使用同步。如果您的方法是
同步的
,那么在第一次调用完成之前,进一步的调用确实会被阻塞,但在其他情况下不会发生这种情况。我推荐“实践中的Java并发性”作为用Java编写多线程代码的良好入门

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

有人能给我解释一下当一个方法 当该方法已由执行时,在单例中调用 这个类的其他实例?我认为JVM会阻止 调用方,直到当前调用方使用该方法完成为止。这是吗 对吧?

答:JVM不会自动同步对singleton对象方法的访问,如果这是您在这里假设的。这与Singleton的一个用途相冲突,即让多个线程执行一个方法,而不为每个想要执行该方法的新线程实例化对象


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


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

对于论坛新手来说,69%是好的,但他有26个问题不被接受。