大家好,想请教各位前辈一个问题
今天我有一个map
Map<String, List<Integer>> map = new HashMap<>();
有一个function void safeAdd(String key, Integer value),
这个safeAdd方法要做的事情是 map.get(key).add(value) ,这边先不用考虑list 是null
请问要如何做才能达到有效率而且是执行绪安全,以下是我的想法
1. 如果是synchronized safeAdd()这样虽然安全,但是没效率,因为就算不同key 也会要等别的key 完成才能进入
2. 同上,用ConcurrentHashMap一样有这个问题
3. 在safeAdd 里面 先 list A = map.get(key) ,再用synchronized (A) { A.add(value) } ,这是我觉得比较好的作法,但是IntelliJ给我警告说synchronization on local variable,但是get 出来的应该是物件的参考,这样会有问题吗
4. 同上,在方法里面改用 synchronized (map.get(key)) {map.get(key).add(value)}
5. 不考虑用BlockingQueue 或 Vector,因为在safeAdd 里面会有其他对list 的操作,例如用size() 去控制list的长度,我希望这个safeAdd被使用的时候同一时间只有单一执行绪对一个key 里面的list 做操作。
我目前是使用4,我有测试过而且看起来是没问题,但是还是怕有什么意外因此上来发问,再麻烦各位帮我解答,谢谢。