私たちは、シングルトンを取得するためのコードに取り組んできました。クラスがコレクションに存在する場合はそれを返し、それ以外の場合は作成してコレクションに保存します。すべての get 操作で同期しないように、ダブルチェック ロックを使用します。
ただし、多くの記事によると、二重チェックのロックが壊れています。ただし、マップは既に初期化されており、内容のチェックが行われているため、これがここに当てはまるかどうかはわかりません。皆さんはどう思いますか?ここでダブルチェックロックを機能させる方法はありますか?
Map <Class <?>, Object> clazzes = getClazzes ();
T singleton = null;
if (false == clazzes.containsKey (clazz))
{
synchronized (clazzes)
{
if (false == clazzes.containsKey (clazz))
{
try
{
singleton = clazz.newInstance ();
clazzes.put (clazz, singleton);
}
catch (InstantiationException e)
{
throw new IllegalArgumentException ( "cannot instantiate class " + clazz, e);
}
catch (IllegalAccessException e)
{
throw new IllegalArgumentException ("cannot instantiate class " + clazz, e);
}
}
else
{
singleton = clazz.cast (clazzes.get (clazz));
}
}
}
ありがとう