[英]Why does HashMap.get(key) needs to be synchronized when change operations are synchronized?
我在一個HashMap上使用來自多個線程的.get(...)
.put(...)
和.clear()
操作。 .put(...)
和.clear()
在synchronized
塊內,但.get(...)
不是。 我無法想象這會導致問題,但在我看到的其他代碼中.get()
幾乎總是同步的。
get / put的相關代碼
Object value = map.get(key);
if(value == null) {
synchronized (map) {
value = map.get(key); // check again, might have been changed in between
if(value == null) {
map.put(key, new Value(...));
}
}
}
而且清楚只是:
synchronized (map) {
map.clear();
}
由於synchronized和get(...)
返回null或實例,寫操作將使緩存無效。 通過將.get(...)
操作放入synchronized(map)
塊,我無法真正看出會出現什么問題或者會有什么改進。
這是一個簡單的場景,會在非同步的get
上產生問題:
get
,計算哈希桶號,並獲得搶占 clear()
,因此分配較小的桶數組 這是一個更復雜的場景:
get
操作,計算哈希桶號,並獲得搶占 put
,並意識到存儲桶需要調整大小 此時,A可能不會找到正確的項目,因為它很可能位於不同索引的哈希桶中。 這就是為什么get
需要一並同步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.