最近想用java写个东西 其中涉及了多线程的读写(就是计数 例如A线程B线程同时请求,需要查看总连请求数然后再加一这种)。
看见了ConcurrentHashMap,不知道如果我直接对一个静态的ConcurrentHashMap多线程进行读写,是否需要加锁?请各位大大明示,谢谢。
------解决方案--------------------
ConcurrentHashMap本身无需加锁
但是如果你操作ConcurrentHashMap是多步,你可能需要额外的锁来保证原子性,也极可能影响了ConcurrentHashMap的伸缩性
------解决方案--------------------
如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
最终的计数结果就是错误的。