Tôi có một đối tượng Danh sách được truy cập bởi nhiều luồng. Có chủ yếu là một chủ đề, và trong một số điều kiện hai chủ đề, cập nhật danh sách. Có một đến năm luồng có thể đọc từ danh sách này, tùy thuộc vào số lượng yêu cầu của người dùng đang được xử lý. Danh sách không phải là một chuỗi nhiệm vụ cần thực hiện, nó là danh sách các đối tượng miền đang được truy lục và cập nhật đồng thời.Cách tiếp cận tốt nhất để sử dụng trong Java 6 cho Danh sách được truy cập đồng thời
Bây giờ có một số cách để làm cho truy cập vào danh sách này thread-safe:
-sử dụng đồng bộ khối
-sử dụng bình thường Khóa (tức là đọc và viết ops chia sẻ cùng khóa)
-sử dụng ReadWriteLock
-sử dụng là một trong những ConcurrentBLABLBA lớp bộ sưu tập mới
câu hỏi của tôi:
Cách tiếp cận tối ưu để sử dụng là gì, vì phần cricital thường không chứa nhiều thao tác (chủ yếu chỉ cần thêm/xóa/chèn hoặc lấy các phần tử trong danh sách)?
Bạn có thể đề xuất một cách tiếp cận khác, không được liệt kê ở trên không?
Một số ép
hiệu suất -optimal là rất quan trọng, sử dụng bộ nhớ không quá nhiều
-nó phải là một danh sách có thứ tự (hiện đồng bộ hóa trên một ArrayList), mặc dù không phải là một danh sách được sắp xếp (tức là không được sắp xếp sử dụng So sánh hoặc so sánh, nhưng theo thứ tự chèn)
danh sách sẽ lớn, chứa tối đa 100.000 đối tượng miền, do đó sử dụng một cái gì đó như CopyOnWriteArrayList không khả thi
phần viết/cập nhật phần mềm thường rất nhanh, làm thêm đơn giản/xóa/chèn hoặc thay thế (bộ)
các hoạt động đọc sẽ chủ yếu gọi hàm elementAt (index) hầu hết thời gian, mặc dù một số hoạt động đọc có thể thực hiện tìm kiếm nhị phân hoặc indexOf (phần tử)
-Không lặp lại trực tiếp trong danh sách được thực hiện, indexOf (..) sẽ duyệt qua danh sách
Tôi thích ý tưởng ConcurrentSkipListMap. Trong 90% thời gian danh sách được sắp xếp theo một số dấu thời gian (một phần của ID của mỗi đối tượng tên miền), do đó, nó có thể là giá trị nó tối ưu hóa cho điều đó. Vẫn sẽ nghĩ về 10% còn lại. –