静态最终字段的同步getter

时间:2015-03-18 02:44:10

标签: java multithreading synchronization drools

我正在查看一个代码片段(下面),我坦率地不明白这个特定的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时间并没有花费任何时间。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

并发问题已经通过将变量声明为final,static并且没有setter而得到了解决。所以我没有看到保持方法同步的必要性。

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

所以你是对的:)