這似乎也許是一個天真的問題,但我和一位同事討論了一下,我認爲沒有真正需要緩存是線程安全的/同步的,因爲我會認爲誰並不重要正在提供一個價值,因爲給定密鑰的值應該是「不變的」(因爲它最終來自同一個來源)。如果這些值可以很容易地改變,那麼緩存本身似乎並不是很有用(因爲如果你關心這個值是「當前正確的」,你應該去原始的源)。緩存是否需要同步?
我看到至少使GET同步的主要原因是,如果在緩存中錯過非常昂貴並且您不希望多個線程每次都出去獲取將值放回緩存中。即使這樣,你也需要在讀取 - 讀取週期期間實際上阻止所有消費者的東西。
無論如何,我的工作假設是散列本質上是線程安全的,因爲對於任何{key,value}組合,值都是null或者是什麼,無論誰去那裏「first」來寫。
問題是:這是一個合理的假設嗎?
更新:我的問題的真正範圍是圍繞非常簡單的id-> value風格的緩存(或{參數} - > {計算值},無論誰寫入緩存,值將是相同的,我們只是試圖從「重新計算」/返回到數據庫中存儲,實際的對象圖形是不相關的,並且緩存通常是長期的。
非常好的一點...當重新生成桶時,它將使用它看作當前鍵/值的集合,並且如果兩個rehash()調用正在進行,則結果可能會很有趣。 謝謝! – 2009-01-30 23:27:40