免责声明:这是一个智力练习的问题,因此我不想在这里使用Enum。
参考我之前的问题: Java: Lazy loading Singleton and reflection attack?
以下是我想出的一个解决方案,以防止IODH成语的反射攻击。你能来吗?评论解决方案并提出其他方法? (我知道'许可'方法:https://stackoverflow.com/a/8112238/266103)
同样,这段代码严格意义上是一种智力练习,我永远不会在现实生活中使用这样的东西。
此外,1)此代码创建两个实例,但如果通过构造函数反射创建实例而不是调用getInstance()
,则保留第二个实例,并且2)它不太可能是线程安全的。
public class Singleton
{
private volatile static boolean isCreated = false;
private static class Holder
{
private static Singleton instance = new Singleton();
}
private Singleton()
{
if(isCreated)
{
throw new RuntimeException("Singleton Multiple Instantiation");
}
Holder.instance = this;
isCreated = true;
}
public static Singleton getInstance()
{
return Holder.instance;
}
}