Bạn nói bộ nhớ cache là chỉ đọc, mà còn được cập nhật trên một khoảng thời gian mà dường như mâu thuẫn.
Nếu toàn bộ bộ nhớ cache được cập nhật trong một khoảng thời gian, tôi sẽ tiếp tục sử dụng biến động. Biến động sẽ đảm bảo rằng bản đồ cập nhật được xuất bản một cách an toàn.
public final class Cache
{
private volatile Map<?,?> cache;
private void mapUpdate() {
Map<?,?> newCache = new HashMap<>();
// populate the map
// update the reference with an immutable collection
cache = Collections.unmodifiableMap(newCache);
}
}
Nếu bản cập nhật khoảng được sửa đổi bộ nhớ cache tương tự, sau đó bạn có thể muốn sử dụng một ConcurrentHashMap, hoặc sao chép bản đồ, cập nhật các bản sao, và cập nhật các tài liệu tham khảo.
public final class Cache
{
private volatile Map<?,?> cache;
private void mapUpdate() {
Map<?,?> newCache = new HashMap<>(cache);
// update the map
// update the reference with an immutable collection
cache = Collections.unmodifiableMap(newCache);
}
}
Nguồn
2012-04-27 21:22:22
Nếu đó là chỉ đọc, bạn cần ... không. –
'volatile' trên một' HashMap' có nghĩa là bạn vượt qua một rào cản bộ nhớ khi bạn nhận/đặt đối tượng 'HashMap'. Không có gì khi bạn thêm hoặc xóa mọi thứ khỏi bản đồ – Gray
@BrianRoach bạn sẽ sử dụng những gì? – DarthVader