3 回答

TA貢獻1844條經驗 獲得超8個贊
你在做什么被稱為“雙重檢查鎖定”。如果您在 Stackoverflow 或 Google 上搜索它,您會發現許多解釋為什么它在 Java 中無法正常工作。
替代方案是:
如果你很可能會在它的持有類被加載時使用這個對象,那么只需直接初始化它并使該字段成為最終的。
聲明字段
volatile
。使用一個持有類,即有一個私有的內部類來持有該字段,然后創建
final
。

TA貢獻1802條經驗 獲得超5個贊
我想到的唯一補充是刪除synchronized初始化并直接使用static-holder-pattern。從最上面的答案:
JVM推遲初始化 InstanceHolder 類,直到它被實際使用,并且因為 Singleton 是用靜態初始化器初始化的,所以不需要額外的同步。
這可以在您的代碼中使用,如下所示:
public class RedisLogger{
public static JedisPool getJedisPool(){
return JedisPoolHolder.INSTANCE;
}
private static final class JedisPoolHolder{
private static final JedisPool INSTANCE = new JedisPool();
}
// the rest of your code
}
添加回答
舉報