我们一直在编写一段代码来获取单例。我们尝试获取它们,如果该类存在于我们的集合中,我们将返回它,否则我们创建它并将其存储在我们的集合中。我们使用双重检查锁定来确保我们不会在每个 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));
}
}
}
谢谢