2009-03-27 27 views
6

Nền nhanh Tôi có một bản đồ đồng thời tôi đã sử dụng để lưu trữ một số giá trị thay đổi khá thường xuyên (vẫn đáng lưu bộ nhớ đệm từ thử nghiệm). Tôi muốn loại bỏ các mục khỏi bộ nhớ cache của tôi trong khoảng thời gian đều đặn bằng cách kiểm tra thời gian hết hạn trong giá trị. Tôi đang sử dụng phương thức keySet() để có được một tham chiếu đến tất cả các phím của tôi và sau đó kiểm tra các giá trị và nếu hết hạn tôi loại bỏ chúng. Trong các chủ đề khác bộ nhớ cache đang được truy vấn và cập nhật (loại bỏ) liên tục.Java ConcurentMap keySet() khi bản đồ được sửa đổi và lặp qua khóa phím

Từ javadocs cho keySet() nó đề cập nếu bản đồ thay đổi trong khi tôi đang lặp qua bộ khóa Đặt kết quả là không xác định. Rõ ràng tôi muốn một cách xác định để đối phó với điều này để kết quả là hợp lệ. Nó sẽ là đủ để vượt qua Set để một HashSet và sau đó iterate trên tập này vì nó là sự hiểu biết của tôi bộ này sẽ không được hỗ trợ bởi bản đồ, đây là một lãng phí của bộ nhớ cách làm việc đó? Bất kỳ ý tưởng đánh giá cao.

Thật không may, người khởi xướng của tôi không phải là cách duy nhất để xóa các mục khỏi bản đồ đồng thời, vì vậy tôi phải sao chép keySet sang một Set khác trước khi lặp qua nó.

Cảm ơn trước

EDIT: Hóa ra tôi đã đọc javadocs đối với phương pháp Bản đồ keySet() thay vì các ConcurrentMap keySet(). Cảm ơn của tôi xấu :)

Trả lại chế độ xem các phím chứa trong bản đồ này. Bộ này là được bản đồ sao lưu, do đó các thay đổi đối với bản đồ được phản ánh trong bộ này và ngược lại. Nếu bản đồ được sửa đổi trong khi lặp lại tập hợp là trong tiến trình (ngoại trừ thông qua hoạt động xóa riêng của trình lặp của ), thì kết quả của lần lặp lại là không xác định. Bộ này hỗ trợ loại bỏ phần tử , loại bỏ các bản đồ tương ứng từ bản đồ, qua Iterator.remove, Set.remove, removeAll retainAll, và xóa hoạt động . Nó không hỗ trợ các hoạt động thêm hoặc thêmTất cả các hoạt động.

Trả lời

6

Bạn đang sử dụng the Java Concurrent HashMap? Từ tài liệu keySet() nó xuất hiện để hành xử theo cách mà bạn thấy hữu ích.

Trả lại chế độ xem được đặt của các phím có trong bản đồ này. Bộ này được bản đồ sao lưu, vì vậy các thay đổi đối với bản đồ được phản ánh trong bộ này và ngược lại. Các thiết lập hỗ trợ loại bỏ phần tử, mà loại bỏ các bản đồ tương ứng từ bản đồ này, thông qua các Iterator.remove, Set.remove, removeAll, retainAll, và các hoạt động rõ ràng. Nó không hỗ trợ các hoạt động thêm hoặc addAll. Trình lặp trở lại của khung nhìn là một trình lặp "yếu nhất quán" sẽ không bao giờ ném ConcurrentModificationException và đảm bảo cho các phần tử đi qua khi chúng tồn tại khi xây dựng bộ lặp và có thể (nhưng không được bảo đảm) phản ánh bất kỳ sửa đổi nào sau khi xây dựng.

tức là bạn có thể xóa nội dung và bạn sẽ ổn.

Nếu bạn không sử dụng thực hiện này, sau đó bạn đang sử dụng (và tại sao? Không phải là buồn cười, nhưng nó sẽ là thú vị để biết lý do tại sao bạn đã thực hiện sự lựa chọn đó)

+0

lớn Cảm ơn Brian ngươi tôi sử dụng một hashmap đồng thời nhưng khi nhìn vào javadocs đã đọc các tài liệu cho bản đồ :) Cảm ơn một triệu –

0

Nếu một bộ nhớ cache LRU sẽ phù hợp với những hóa đơn cũng đủ cho bạn, hãy kiểm tra LinkedHashMap -nó làm cho việc thực hiện một bộ nhớ cache LRU tầm thường, và sau đó bạn có thể làm cho kết quả thread bằng cách gói nó với một cuộc gọi đến Collections.synchronizedMap.

Các vấn đề liên quan