public void add(String key)这个方法不同步,多线程更新HashMap时会导致数据操作; ConcurrentHashMap是线程安全的。
如果使用ConcurrentHashMap来替换HashMap,并且仅仅去掉synchronized关键字 public class TestClass{ private ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>(); public void add(String key){ Integer value = map.get(key); if(value == null){ map.put(key,1); } else map.put(key,value+1); } }第二段应该用ConcurrentHashMap,刚打错了,已更正。 只是把synchronized去掉,应该会有别的问题吧?
ConcurrentHashMap,据我了解并发对其操作的线程数小于16时,其稳定性很好,否则会出现和非同步的HashMap一样的情况;所以ConcurrentHashMap不是绝对的线程安全,为什么不写成绝对的线程安全的,可能是考虑到了性能问题;所以一般情况下用ConcurrentHashMap可以达到线程安全的目的。 若在N多个线程并发操作HashMap时,建议这样: public class Test { private static final Object lock = new Object();
private Map<String, Object> map = new HashMap<>();
ConcurrentHashMap是线程安全的。
public class TestClass{
private ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
public void add(String key){
Integer value = map.get(key);
if(value == null){
map.put(key,1);
}
else
map.put(key,value+1);
}
}第二段应该用ConcurrentHashMap,刚打错了,已更正。
只是把synchronized去掉,应该会有别的问题吧?
若在N多个线程并发操作HashMap时,建议这样:
public class Test {
private static final Object lock = new Object();
private Map<String, Object> map = new HashMap<>();
public void addValue(){
synchronized (lock) {
map.put("", "");
}
}
}