最近想用java写个东西 其中涉及了多线程的读写(就是计数  例如A线程B线程同时请求,需要查看总连请求数然后再加一这种)。
看见了ConcurrentHashMap,不知道如果我直接对一个静态的ConcurrentHashMap多线程进行读写,是否需要加锁?请各位大大明示,谢谢。

解决方案 »

  1.   

    ConcurrentHashMap本身无需加锁但是如果你操作ConcurrentHashMap是多步,你可能需要额外的锁来保证原子性,也极可能影响了ConcurrentHashMap的伸缩性
      

  2.   

    如2楼所说,从你的需求(计数)来看,是需要加锁的。否则可能产生脏读、脏写等问题。1、 Integer i = map.get(key);
    2、 i = i + 1;
    3、 map.put(key, i);如果AB两个线程交替执行,类似:
    A:1
    B:1
    A:2
    B:2
    A;3
    B:3最终的计数结果就是错误的。