亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在多線程環境中將 HashSet 用作非常簡單的緩存是否安全?

在多線程環境中將 HashSet 用作非常簡單的緩存是否安全?

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

2 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

您可以使用 ConcurrentHashMap 進行多線程訪問和寫入操作。如果只需要 HashSet,可以從 ConcurrentHashMap 派生 ConcurrentHashSet。你可以這樣使用。

Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();


查看完整回答
反對 回復 2022-12-21
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

否。如果您想Map在多線程環境中使用 a,請使用Collections.synchronizedMap(<map object>)or ConcurrentHashMap.newKeySet();

Set<String> concurrentSet = Collections.synchronizedSet(new HashSet<>());

要么...

Set<String> concurrentSet = ConcurrentHashMap.newKeySet();


查看完整回答
反對 回復 2022-12-21
  • 2 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號