解决方案 »

  1.   

    public void add(String key)这个方法不同步,多线程更新HashMap时会导致数据操作;
    ConcurrentHashMap是线程安全的。
      

  2.   

    如果使用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去掉,应该会有别的问题吧?
      

  3.   

    ConcurrentHashMap,据我了解并发对其操作的线程数小于16时,其稳定性很好,否则会出现和非同步的HashMap一样的情况;所以ConcurrentHashMap不是绝对的线程安全,为什么不写成绝对的线程安全的,可能是考虑到了性能问题;所以一般情况下用ConcurrentHashMap可以达到线程安全的目的。
    若在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("", "");
    }
    }
    }