Tôi muốn thu thập một số chỉ số từ các vị trí khác nhau trong ứng dụng web. Để đơn giản, tất cả những điều này sẽ là bộ đếm và do đó hoạt động sửa đổi duy nhất là tăng chúng lên 1.Bộ đếm gia tăng nguyên tử được lưu trữ trong ConcurrentHashMap
Gia số sẽ đồng thời và thường xuyên. Các lần đọc (bán phá giá các số liệu thống kê) là một hoạt động hiếm hoi.
Tôi đã nghĩ đến việc sử dụng ConcurrentHashMap. Vấn đề là làm thế nào để tăng các bộ đếm chính xác. Vì bản đồ không có thao tác "tăng dần", tôi cần phải đọc giá trị hiện tại trước tiên, tăng giá trị đó hơn đặt giá trị mới trong bản đồ. Nếu không có nhiều mã, đây không phải là một hoạt động nguyên tử.
Có thể đạt được điều này mà không cần đồng bộ hóa (điều này sẽ đánh bại mục đích của ConcurrentHashMap)? Tôi có cần phải xem Guava không?
Cảm ơn mọi con trỏ.
P.S.
Có một câu hỏi liên quan về SO (Most efficient way to increment a Map value in Java) nhưng tập trung vào hiệu suất và không đa luồng
CẬP NHẬT
Đối với những người đến đây thông qua tìm kiếm trên cùng một chủ đề: bên cạnh những câu trả lời dưới đây, có một hữu ích presentation ngẫu nhiên bao gồm cùng một chủ đề. Xem trang trình bày 24-33.
Chỉ cần đừng quên để lưu trữ các 'HashMap' trong một Thành viên 'final'. Và tốt hơn nên bọc bản đồ vào trong một trình bao bọc 'unmodifiable'. Tốt hơn, bạn có thể sử dụng 'ImmutableMap' từ Guava (siêu bộ sưu tập của google) và nó thực sự rất nhanh. –
@Zwei: điểm tốt, chỉnh sửa câu trả lời để bao gồm lời khuyên đó :) –
Danh sách các chỉ số được xây dựng khi chúng cung cấp dữ liệu (tức là các phím của bản đồ sẽ được thêm vào khi hệ thống chạy và các điểm thu thập khác nhau được nhấn; ưu tiên sẽ dễ xảy ra lỗi). Tôi quên về incrementAndGet của AtomicLong(), đó chỉ là những gì tôi cần. Nếu nó không tồn tại, tôi đã nghĩ rằng một cách tiếp cận khác sẽ là dành cho những người thu thập số liệu không phải để tăng các quầy, nhưng chỉ đơn giản là thêm yêu cầu để làm như vậy trong một hàng đợi được duy trì bởi singleton. Do đó, người gọi chỉ thêm() vào danh sách, định kỳ được đọc và xử lý. Không đơn giản như vậy. – wishihadabettername