Tag: 懒惰加载

Java:懒惰加载Singleton和reflection攻击?

如果我通过holder idiom或double checked lock实现Singleton,而不是调用’getInstance()’,使用reflection实例化它,然后在其上调用’getInstance()’,这将创建两个实例,打破模式。 所以我在类中添加一个静态’counter’成员,在类的私有构造函数中递增它,如果它超过’1’则抛出exception。 但在这种情况下,如果我首先通过reflection进行实例化,那么没有其他人能够在不抛出exception的情况下调用’getInstance()’。 那么我如何懒惰加载Singleton但却阻止它受到这次攻击呢? (我知道’Enum’模式,但有些人觉得它实际上是一个黑客。检查对这个接受的答案的评论: 这个Singleton是否对序列化和reflection攻击都有抵抗?顺便说一句,我的问题是不同的)。 编辑:我认为在DCL的情况下,通过使用静态计数器字段,基于类的同步构造函数并将“this”分配给静态成员,可以防止它。 但是,不确定如何在持有人成语的情况下防止它。

延迟加载的单例:双重检查锁定与按需持有者惯用语初始化

我需要在并发环境中延迟加载资源。 加载资源的代码只能执行一次。 双重检查锁定 (使用JRE 5+和volatile关键字)和初始化按需持有者习惯似乎很适合这项工作。 仅仅通过查看代码,按需初始化持有者习惯看起来更干净,更有效(但是,嘿,我在这里猜测)。 不过,我必须小心并记录我的每一个单身人士的模式。 至少对我而言,很难理解为什么代码是这样编写的…… 我的问题是:哪种方法更好? 为什么? 如果你的答案是否定的。 您将如何在Java SE环境中解决此要求? 备择方案 我可以使用CDI而不强加它在整个项目中的使用吗? 那里有文章吗?