同步映射线程的这种用法安全吗?
|
我有一个单例类,该类具有一个可以同时由多个线程访问的映射。有人可以检查下面的代码,并告诉我其线程是否安全?
(注意:我不打算使用ConcurrentHashMap,并且很少调用printMap方法。)
public class MySingleton{
private Map<String,String> cache = Collections.synchronizedMap(
new LinkedHashMap<String,String>());
public String getValue(String key){
return cache.get(key)
}
public void setValue(String key, String value){
cache.put(key, value);
}
public void printMap(){
synchronized(cache){
for(Entry<String,String> entry: cache.entrySet()){
println(\'key: \'+entry.getKey()+\', value: \' + value);
}
}
}
}
我的测试正在运行...但是我怀疑这段代码是否足够好以至于被称为“线程安全”。
我考虑的要点:
readValue和putValue方法不需要具有'synchronized \'块,因为我使用的是syncedMap
printMap应该具有synced块,因为for的javadoc表示我们应该在每次迭代之前同步Map实例。
http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#synchronizedMap%28java.util.Map%29
任何帮助表示赞赏。
没有找到相关结果
已邀请:
3 个回复
骚瓤
最终都会在
上进行同步。 我个人更希望通过使用“ normal”哈希图并通过所有三种方法在同一对象(无论是映射还是其他)上进行同步来使它明确化,但是您应该可以。 (或者,您可以使用
开始。至少值得一看。)
砷竣阿
磐去裸猜饲
关键字保证其他线程在
中看不到
):