Java的:延迟加载辛格尔顿和反射攻击?(Java: Lazy loading Singleton

2019-09-16 12:11发布

如果我实现一个Singleton既可以通过持有人的成语或双检查锁定,但而不是调用“的getInstance()”,使用反射来实例化,然后调用“的getInstance()”就可以了,这样会创建两个实例,打破格局。

所以我静“反”成员添加到类,增加它在类的私有构造函数,如果它穿过抛出一个异常“1”。 但在这种情况下,如果我第一次通过反射实例化,没有人将能够调用“的getInstance()”未抛出异常。

那么,如何延迟加载一个Singleton又防止它从这次攻击? (我知道的“枚举”的格局,但有些人认为它实际上是一个黑客检查的这一公认的答案意见: ?这是辛格尔顿,以序列化和反射攻击性和顺便说一句,我的问题是不同的)。

编辑:我认为这是可能的,以防止它在DCL的情况下,通过静态计数器字段,基于类的同步构造和分配“这”的静态成员。 然而,不知道如何防止它在支架成语的情况。

Answer 1:

我个人坚持用枚举,但也有点播持有人(IODH)成语初始化

static class SingletonHolder {
  static Singleton instance = new Singleton();    
}

public static Singleton getInstance() {
  return SingletonHolder.instance;
}

这似乎是有效的Java(第48项),但我第一次听到它从一个岗位由疯狂的鲍勃

http://blog.crazybob.org/2007/01/lazy-loading-singletons.html

见http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#dcl对于大量有趣的讨论。



文章来源: Java: Lazy loading Singleton and reflection attack?