【问题标题】:Synchronized getter of a static final field静态最终字段的同步 getter
【发布时间】:2015-03-18 02:44:09
【问题描述】:

我正在查看下面的代码片段,坦率地说,我不明白使这个特定的 getter 同步背后的想法。

public class MVELSafeHelper {
  private static final MVELEvaluator evaluator;
  static {
    evaluator = KiePolicyHelper.isPolicyEnabled() ? new SafeMVELEvaluator() : new RawMVELEvaluator();
  }
  public static synchronized MVELEvaluator getEvaluator() {
    return evaluator;
  }
//
}

我不是并发方面的专家,我相信 Drools 项目的人比我更有经验,但我只是想知道这是一个错字还是这个结构在某些情况下可能是值得的,因此 40%我的服务器的 CPU 时间并没有白白浪费。

【问题讨论】:

  • 你说的很对,同步这个方法是没有意义的。
  • 类中还有其他同步的静态方法吗?
  • @Osw 如果是 Drools 版本 6.2.0,你应该提醒 Drools 开发团队。
  • @laune,已经这样做了,一直在想我错过了什么,不得不咨询 SO 社区)

标签: java multithreading synchronization drools


【解决方案1】:

通过将变量声明为 final、static 并且没有 setter 已经解决了并发问题。所以我认为没有必要保持方法同步。

如果它是关于变量实例化的,那么由于它在静态块中,它将在 getter 调用之前执行。

所以你是绝对正确的:)

【讨论】:

    【解决方案2】:

    在这种情况下,不需要同步关键字,因为 MVELEvaluator 在静态块中实例化一次,并且其引用不能更改,因为它被声明为 final。因此,无需控制多个线程对其引用的访问。

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多