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跟上鎖的不同