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

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

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