Thêm vào câu trả lời của Ken, nếu tạo một đối tượng hạng nặng mà sau đó bị bỏ đi thì KHÔNG được chấp nhận (bạn muốn đảm bảo rằng chỉ một đối tượng được tạo cho mỗi khóa), thì bạn có thể làm điều này bằng .. .. thực sự, không. Đừng tự làm. Sử dụng các google-collections (nay guava) MapMaker class:
Map<KeyType, HeavyData> cache = new MapMaker<KeyType, HeavyData>()
.makeComputingMap(new Function<KeyType, HeavyData>() {
public HeavyData apply(KeyType key) {
return new HeavyData(key); // Guaranteed to be called ONCE for each key
}
});
Sau đó, một đơn giản cache.get(key)
chỉ làm việc và hoàn toàn loại bỏ bạn khỏi phải lo lắng về những khía cạnh khó khăn của đồng thời và syncrhonization.
Lưu ý rằng nếu bạn muốn thêm một số tính năng ra như hết hạn, nó chỉ là
Map<....> cache = new MapMaker<....>()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(.....)
và bạn cũng có thể dễ dàng sử dụng các giá trị mềm hay yếu cho một trong hai phím hoặc dữ liệu nếu cần thiết (xem Javadoc để biết thêm chi tiết)
Chỉ cần tự hỏi: yêu cầu bộ nhớ đệm của bạn thực sự là gì? Bạn có cần phải cache toàn bộ đóng cửa chuyển tiếp của đối tượng có trọng lượng nặng để nó nhất quán trên cụm máy chủ ứng dụng của bạn không? Nếu vậy, đây là vấn đề không quan trọng để giải quyết và bạn có thể sử dụng thư viện bộ nhớ cache như ehcache tốt hơn. – Alan