以下のシングルトンクラスを設計していましたが、シングルトンが壊れる可能性があることを認識しています
public class SingletonObject {
private static SingletonObject ref;
private SingletonObject () //private constructor
{ }
public static synchronized SingletonObject getSingletonObject()
{
if (ref == null)
ref = new SingletonObject();
return ref;
}
public Object clone() throws CloneNotSupportedException
{throw new CloneNotSupportedException ();
}
}
次のURLは、シングルトンが他の方法でクラッキングシングルトンを壊すことができる場所をすでに示唆していますが、私の質問は、このURLで示唆されているように、シングルトンはクラスローダーによって壊される可能性があり、同じクラスが2つの異なるクラスローダーによってロードされる可能性があるということです。 2 つの異なるクラス ローダーによってロードされたクラスで getInstance() メソッドを呼び出すだけで、シングルトン クラスの 2 つのインスタンスを作成します。このアプローチは、プライベート コンストラクターに違反することに頼る必要なく機能します。
ClassLoader cl1 = new URLClassLoader(new URL[]{"singleton.jar"}, null);
ClassLoader cl2 = new URLClassLoader(new URL[]{"singleton.jar"}, null);
Class<?> singClass1 = cl1.loadClass("hacking.Singleton");
Class<?> singClass2 = cl2.loadClass("hacking.Singleton");
//...
Method getInstance1 = singClass1.getDeclaredMethod("getInstance", ...);
Method getInstance2 = singClass2.getDeclaredMethod("getInstance", ...);
//...
Object singleton1 = getInstance1.invoke(null);
Object singleton2 = getInstance2.invoke(null);
また、これを回避するためにどのような措置を講じるべきか教えてください。