![](/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.