ConcurrentHashMap.compute(key, (k, list) -> { list.add(value); return list });如果需要考虑list为空,就再加个检查和new不过compute只会挡update类型的作业,你要达到类似DB交易(update中也block其他get)的话,就是get也改用compute想像你的需求大概是这样
https://ideone.com/tCmTV2你的3 4作法其实效果一样,IntelliJ的警告只是个提醒,真正的问题在于你synchonized list的期间,如果别的thread做了Map.put(key, ...),你的list是安全的,但是map.get(key)已不再是你的list而是别的东西,所以一楼才建议锁map都用compute可以解决这问题更正,4的作法有个更糟的点是两个map.get(key)间还有空窗,这中间map.put(key,...)的话,呼叫add的list跟上锁的不同