大家好,想請教各位前輩一個問題
今天我有一個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,我有測試過而且看起來是沒問題,但是還是怕有什麼意外因此上來發問,再麻煩各位幫我解答,謝謝。