我意識到對此有類似的問題/答案,但我似乎無法找到我正在尋找的東西。我正在尋求實現一個內存緩存,它緩存對正在執行存在性檢查的數據庫的調用結果。這種存在性檢查非常昂貴,一旦對象存在于數據庫中,它就永遠不會被刪除,所以我只需要一個非常簡單的內存緩存(甚至是進程內緩存)。一旦進行了數據庫調用,進程就會記住該 ID 存在性檢查的結果,并且不應再次調用數據庫。(也許要提到的另一件事是,如果數據庫中不存在該對象,它將被創建)。我正在為此使用 HashSet (java),并在檢查/創建完成后將 ID 添加到集合中,但這是一個高度并發的環境,我不確定 HashSet 缺乏線程安全性的影響。該代碼僅使用 add() 和 contains() 方法(無迭代)。我真的不關心這里和那里的緩存未命中(以及由此產生的額外數據庫調用),但我想知道的是,在并發線程中調用 add() 和 contains() 的這種模式是否會導致到更災難性的錯誤。
2 回答

瀟湘沐
TA貢獻1816條經驗 獲得超6個贊
您可以使用 ConcurrentHashMap 進行多線程訪問和寫入操作。如果只需要 HashSet,可以從 ConcurrentHashMap 派生 ConcurrentHashSet。你可以這樣使用。
Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();

繁花如伊
TA貢獻2012條經驗 獲得超12個贊
否。如果您想Map
在多線程環境中使用 a,請使用Collections.synchronizedMap(<map object>)
or ConcurrentHashMap.newKeySet();
:
Set<String> concurrentSet = Collections.synchronizedSet(new HashSet<>());
要么...
Set<String> concurrentSet = ConcurrentHashMap.newKeySet();
添加回答
舉報
0/150
提交
取消