我有这个创建对象的单例,目前它看起来像这样:
public ApplicationManagerSingleton {
....
private Map<String, Thing> map = new HashMap<String, Thing>();
public Thing getThingById( String id ) {
Thing t = null;
if ( !map.contains(id) ) {
t = longAndCostlyInitializationOfThing();
map.put(id, t );
}
return map.get(id);
}
}
它的一个明显问题是,如果两个线程试图访问同一个东西,它们最终可能会复制这个东西。
所以我用了一个锁:
public ApplicationManagerSingleton {
private Map<String, Thing> map = new HashMap<Sring, Thing>();
public Thing getThingById(String id ) {
synchronized( map ) {
if (!map.contains(id)) {
t = initialize....
}
map.put(id, t);
}
returns map.get(id);
}
}
但现在这是最糟糕的,因为每次创建新资源时我都会锁定地图一段时间,因为其他线程想要不同的东西。
我很确定使用 Java 5 并发包会更好。有人可以指出我正确的方向吗?
我要避免的是锁定对其他事物感兴趣的其他线程的类或映射。