Java:懒惰加载Singleton和反射攻击?

时间:2012-04-13 09:18:19

标签: java reflection singleton lazy-loading

如果我通过holder idiom或double checked lock实现Singleton,而不是调用'getInstance()',使用反射来实例化它,然后在其上调用'getInstance()',这将创建两个实例,打破模式。

所以我在类中添加一个静态'counter'成员,在类的私有构造函数中递增它,如果它超过'1'则抛出异常。但在这种情况下,如果我首先通过反射进行实例化,那么没有其他人能够在不抛出异常的情况下调用'getInstance()'。

那么我如何懒惰加载Singleton但却阻止它受到这次攻击呢? (我知道'Enum'模式,但有些人认为它实际上是一个黑客。请检查对此接受的答案的评论:is this Singleton resistant to both Serialization and Reflection Attacks?顺便说一下,我的问题不同了。

编辑:我认为通过使用静态计数器字段,基于类的同步构造函数并将“this”赋给静态成员,可以在DCL的情况下阻止它。但是,如果持有人习惯用法,不确定如何防止它。

1 个答案:

答案 0 :(得分:0)

我个人坚持使用Enums,但也有初始化按需持有人(IODH)成语

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

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

这出现在Effective 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