静态最终字段的同步 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 时间都没有白花。
在这种情况下不需要同步关键字,因为 MVELEvaluator 在静态块中实例化一次,并且不能更改其引用,因为它被声明为最终的。因此无需控制多个线程对其引用的访问。
并发问题已经通过将变量声明为最终的、静态的并且没有 setter 来解决。所以我看不出保持方法同步的必要性。
如果它是关于变量实例化的,那么由于它在静态块中,它将在 getter 调用之前执行。
所以你完全正确:)
我正在查看下面的代码片段,坦率地说,我不明白使这个特定 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 时间都没有白花。
在这种情况下不需要同步关键字,因为 MVELEvaluator 在静态块中实例化一次,并且不能更改其引用,因为它被声明为最终的。因此无需控制多个线程对其引用的访问。
并发问题已经通过将变量声明为最终的、静态的并且没有 setter 来解决。所以我看不出保持方法同步的必要性。
如果它是关于变量实例化的,那么由于它在静态块中,它将在 getter 调用之前执行。
所以你完全正确:)