【问题标题】:Why sharing a static variable between threads reduce performance?为什么在线程之间共享静态变量会降低性能?
【发布时间】:2014-08-17 17:58:47
【问题描述】:

我问了问题here,有人留言说问题是我是sharing a static variable

为什么会有这样的问题?

【问题讨论】:

  • 因为全局变量是个坏消息。朋友不要让朋友使用 globals
  • 它不会降低性能(单独)。但这通常会导致需要同步锁才能安全地共享它,这反过来又会导致各种悲伤。
  • 嗯?我从没有说过!我说您在线程之间共享一个静态字段,并且(很可能)假设该类是内部同步的,这显然会导致显示的性能问题。您在 cmets 中没有正确 ping 我,这就是我没有收到任何通知的原因。
  • 线程在尽可能少地共享时运行得最好。当线程共享资源时,这会减慢它们的速度。
  • @PeterLawrey 仅在发生突变或同步时。共享常量不是问题,使用常量可以提高性能。我所说的常量是指“静态最终”和“静态”对数据的引用,这些数据在初始化之后永远不会发生变异。

标签: java multithreading performance static static-members


【解决方案1】:

共享一个静态变量本身应该不会对性能产生不利影响。全局数据是通用的,所有程序都以 JVM 和 OS 结构开头。

可变共享数据是另一回事,因为共享数据的突变会导致性能问题(至少缓存未命中)和正确性问题,这很痛苦,通常使用锁来解决,这可能会导致其他性能问题。

【讨论】:

    【解决方案2】:

    wiki 静态变量看起来像是程序中相当重要的一部分。不知道它正在发生什么或它是如何编码的,我猜它会锁定以保持一致的状态。如果您的大多数线程都花时间阻塞等待获取对同一对象的访问权限,那么这可以解释为什么您没有看到使用多个线程的任何好处。

    要使线程对程序的性能产生影响,它们必须相当独立,而不是全部锁定在同一事物上。他们必须做的锁定越多,您看到的收益就越少。所以尽量把工作分开,尽可能多地独立完成。例如,如果有可以独立收集的工作项,那么最好让多个线程去查找工作项,然后将它们提供给一个队列,一个专用线程可以使用该队列将工作项从队列中拉出并提供将它们添加到 wiki 对象。

    【讨论】:

    • 我发现了在 Wiki 对象中进行编辑的函数被声明为这个 public void synchronized edit(...) 的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多