我有一个单例类,它有一个可以由多个线程同时访问的映射。有人可以检查下面的代码并告诉我它的线程是否安全吗?(注意:我不打算使用 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 方法不需要“同步”块,因为我使用的是 synchronizedMap
printMap 应该有 synchronized 块,因为 javadoc for 说我们应该在每次迭代之前同步 Map 实例。 http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#synchronizedMap%28java.util.Map%29
任何帮助表示赞赏。