3 回答

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

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
我想到的唯一補(bǔ)充是刪除synchronized初始化并直接使用static-holder-pattern。從最上面的答案:
JVM推遲初始化 InstanceHolder 類,直到它被實(shí)際使用,并且因?yàn)?Singleton 是用靜態(tài)初始化器初始化的,所以不需要額外的同步。
這可以在您的代碼中使用,如下所示:
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
}
添加回答
舉報(bào)