這是我的加載緩存的定義把一個值:在谷歌番石榴loadingCache
private class ProductValue {
private long regionAValue;
private long regionBValue;
// constructor and general stuff here
}
private final LoadingCache<ProductId, ProductValue> productCache = CacheBuilder.newBuilder()
.expireAfterAccess(4, TimeUnit.MINUTES)
.build(new CacheLoader<ProductId, ProductValue>() {
@Override
public ProductValue load(final ProductId productId) throws Exception {
return updateProductValues(productId);
}
});
private ProductValue updateProductValues(final ProductId productId) {
// Read from disk and return
}
現在,我已經在那裏我需要設置地域性或regionB的值在緩存中,直至使用情況下一次更新發生。我心亂如麻關於邏輯的併發影響我有:
public void setProductValue(final ProductId productId, final boolean isTypeA, final long newValue) throws ExecutionException {
ProductValue existingValues = productCache.get(productId); // 1
if (isTypeA) {
existingValues.regionAValue = newValue;
} else {
existingValues.regionBValue = newValue;
}
productCache.put(productId, existingValues); // 2
}
在1
我剛纔讀的存儲在緩存中給定的密鑰信息的參考,這得到的是線程安全的,因爲加載緩存的作用就像一個併發地圖。但是在1
和2
之間,此引用可以被其他某個線程覆蓋。由於我使用緩存中已存在的引用覆蓋了「值」,因此是否需要將鍵值對放入緩存中?我需要行2
?
是的,其他線程可以在1之後但在2或3之前訪問和修改緩存。 – 2014-10-29 04:46:01
請參閱編輯。 – user1071840 2014-10-29 11:29:37