使用Singleton / Static会降低多线程应用程序(在多核系统上运行)吗? 我正在运行一个应用程序,在8核心机器上创建6个线程。最初在所有线程之间共享一些单例对象。从单线程模型到多线程模型,我没有获得预期的性能提升。 在此之后,我更改了我的代码,以便没有单例或静态(即尝试不在线程之间共享任何内容),我的性能提升了大约6倍。 有人可以解释一下这种行为吗?
答案 0 :(得分:4)
static
绝对与减速毫无关系。实际上,静态字段是所有要访问的最快。
单身人士本身也不是问题。你可能有懒惰初始化的单例,其访问者方法是 synchronized 。在这种情况下,你的代码只是使用了错误的习惯用法。 static
单身人士的选择成语是lazy initialization holder class,它会产生零惩罚,完全是线程安全的。
您可能也会遇到单身人士需要同步的方法。通常,如果我们使用可变单例,那是因为我们别无选择,只能使用它们。如果你有这样的选择,那么一定要避免单身。
为了获得最佳性能,请坚持这些简单的规则:
尽可能少地分享可变状态。突变需要相互排斥并伤害表现;
尽可能多地共享不可变状态。这将减少CPU缓存未命中并提高性能。
答案 1 :(得分:1)
有很多issues有状态单例,但你所描述的内容听起来更像是单身对象的争用。也就是说,你的减速因为你的单身人士正在同步某事。在这种情况下,多线程版本可能不会做同样的事情;也就是说,您可能已经为race condition交换了性能问题。您需要向我们展示代码的更多详细信息,以获得更具体的答案。原样,几乎只是在猜测。
BTW,IMHO州少单身人士最好以enum
处理。