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
}
添加回答
举报