【发布时间】:2014-04-28 10:16:19
【问题描述】:
我们一直在编写一段代码来获取单子。我们尝试获取它们,如果该类存在于我们的集合中,我们返回它,否则我们创建它并将其存储在我们的集合中。我们使用双重检查锁定来确保我们不会在每次获取操作时同步。
但是,根据很多文章,双重检查锁定已被破坏。但是我不知道这里是否是这种情况,因为地图已经初始化并且对包含进行了检查。你们有什么感想?有没有办法让双重检查锁定在这里工作?
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));
}
}
}
谢谢
【问题讨论】:
标签: java synchronization hashmap concurrenthashmap double-checked-locking