![](/img/trans.png)
[英]'public static final' or 'private static final' with getter?
[英]Synchronized getter of a static final field
我正在查看下面的代码片段,坦率地说,我不明白使这个特定的 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 时间不会白白浪费。
在这种情况下,synchronized 关键字不是必需的,因为 MVELEvaluator 在静态块中实例化一次,并且其引用不能更改,因为它被声明为 final。 所以没有必要控制对多个线程的引用的访问。
并发问题已经通过将变量声明为 final、static 并且没有 setter 来处理。 所以我认为没有必要保持方法同步。
如果它是关于变量实例化,那么由于它在静态块中,它将在 getter 调用之前执行。
所以你是绝对正确的:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.