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”分配给静态成员,可以防止它。 但是,不确定如何在持有人成语的情况下防止它。

在Java中是否可以更改或修改枚举本身,从而破坏枚举单例?

是否有可能以某种方式在运行时更改枚举? 例如使用reflection。 问题不是要改变枚举常量的状态。 它将要更改枚举的常量集或删除任何常量。 关于以下枚举,是否可以添加颜色WHITE或删除颜色RED或更改其顺序? public enum Color { RED, GREEN, BLUE; } 为什么我问? 首先,我想知道它是否可行。 但如果是的话,它会对使用Enum实现单例的常见方式产生影响吗? 我知道这个问题有点恶意。 但即使是约书亚布洛赫在谈论(1)关于实施单身人士并推荐了枚举单身人士模式时也提到了“ 巧妙制造的攻击 ”。 如果我们可以修改枚举,那么对这种模式的攻击是否可行? 我试图解决它并部分管理它。 我将发布我的结果作为答案 – 遵循这个建议 。 (1)请参阅在Java中实现单例模式的有效方法是什么? 其中包含指向effective_java_reloaded.pdf的链接,第31页。

Singleton:如何通过Reflection停止创建实例

我知道在Java中我们可以通过new , clone() , Reflection以及serializing and de-serializing来创建Class的实例。 我创建了一个实现Singleton的简单类。 我需要一直停止创建我的类的实例。 public class Singleton implements Serializable{ private static final long serialVersionUID = 3119105548371608200L; private static final Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance(){ return singleton; } @Override protected Object clone() throws CloneNotSupportedException { throw new CloneNotSupportedException(“Cloning of this class is not […]