两个线程同时操作一个全局map,如何保证值不被覆盖?
public static Map<Integer, String> DATA_MAP = new ConcurrentHashMap<>(16);
DATA_MAP.put(3,"null,null");
- 首先两个线程同时取Map的值
- 使用当前时间分别替换掉value的两个null
String str = DATA_MAP.get(3);
Thread.sleep(1000);
String replaceStr = nextParam.replaceFirst("null",System.currentTimeMillis()+"");
DATA_MAP.put(nodeInfo.getNextNodeId(),replaceStr);
我现在得到的key为3的结果是:
20191233311231,null
//最后执行的会覆盖掉前一个执行的结果。 因为取值是得到的都是"null,null"
我想得到的结果是:
20191233311231,201912321321411
如何去做?
可以上传一下完整的代码吗? 因为这里看不到另一个线程的操作。
ConcurrentHashMap是能保证一个写操作的的原子性,你这样先取出来,改完后put进去,结果肯定是这样。(一个读操作+一个写操作,ConcurrentHashMap不能保证原子性)