2

如果我通过持有者惯用语或双重检查锁定来实现单例,而不是调用“getInstance()”,而是使用反射来实例化它,然后在其上调用“getInstance()”,这将创建两个实例,从而打破模式.

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

那么我如何延迟加载 Singleton 并防止它受到这种攻击呢?(我知道'Enum'模式,但有些人认为它实际上是一种黑客攻击。检查对这个公认答案的评论:这个单例对序列化和反射攻击有抵抗力吗?顺便说一句,我的问题是不同的)。

编辑:我认为在 DCL 的情况下可以通过使用静态计数器字段、基于类的同步构造函数并将“this”分配给静态成员来防止它。但是,不知道在持有人成语的情况下如何防止它。

4

1 回答 1

0

就我个人而言,我坚持使用 Enums,但也有 Initialization on Demand Holder (IODH) 习惯用法

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

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

这出现在 Effective Java (item 48) 中,但我第一次听说它是从 crazy bob 的帖子中听到的

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

有关许多有趣的讨论,请参阅http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#dcl

于 2012-04-13T09:42:41.883 回答