Khi nào thì ConcurrentSkipListSet hữu ích?


84

Tôi vừa thấy cấu trúc dữ liệu này trên API Java 6 và tôi tò mò về việc khi nào nó sẽ là một tài nguyên hữu ích. Tôi đang học cho kỳ thi scjp và tôi không thấy nó được đề cập trong sách của Kathy Sierra, mặc dù tôi đã xem các đề thi thử có đề cập đến nó.

Câu trả lời:


175

ConcurrentSkipListSetConcurrentSkipListMap rất hữu ích khi bạn cần một vùng chứa được sắp xếp sẽ được nhiều luồng truy cập. Về cơ bản, đây là những điểm tương đương của TreeMap và TreeSet cho mã đồng thời.

Việc triển khai cho JDK 6 dựa trên Bảng băm không khóa động hiệu suất cao và Bộ dựa trên danh sách của Maged Michael tại IBM, điều này cho thấy rằng bạn có thể triển khai nhiều hoạt động trên danh sách bỏ qua một cách nguyên tử bằng cách sử dụng các phép toán so sánh và hoán đổi (CAS) . Đây là những lớp không có khóa, vì vậy bạn không phải lo lắng về chi phí synchronized(đối với hầu hết các hoạt động) khi bạn sử dụng các lớp này.

Hiện không có triển khai Bản đồ / Tập hợp đồng thời dựa trên cây Đỏ-Đen trong Java. Tôi đã xem qua tài liệu một chút và tìm thấy một vài bài báo cho thấy cây RB đồng thời hoạt động tốt hơn danh sách bỏ qua, nhưng rất nhiều thử nghiệm này được thực hiện với bộ nhớ giao dịch , không được hỗ trợ trong phần cứng trên bất kỳ kiến ​​trúc lớn nào vào lúc này.

Tôi giả định rằng các anh chàng JDK đã sử dụng danh sách bỏ qua ở đây bởi vì việc triển khai đã nổi tiếng và vì việc làm cho nó không bị khóa rất đơn giản và dễ di chuyển (sử dụng CAS). Nếu bất cứ ai quan tâm để làm rõ, xin vui lòng làm. Tôi tò mò.


1
Nó cũng hữu ích nếu bạn muốn theo dõi các bản ghi duy nhất trong môi trường đa luồng một cách hiệu quả.
anataliocs

4

danh sách bỏ qua là danh sách được sắp xếp và hiệu quả để sửa đổi với hiệu suất log (n). về mặt đó, nó giống như TreeSet. tuy nhiên không có ConcurrentTreeSet. những gì tôi nghe nói là danh sách bỏ qua rất dễ thực hiện, đó có thể là lý do tại sao.

Dù sao, khi bạn cần một tập hợp đồng thời, được sắp xếp và hiệu quả, bạn có thể sử dụng ConcurrentSkipListSet


2

Những điều này rất hữu ích khi bạn cần một tập hợp có thể được nhiều luồng truy cập đồng thời một cách an toàn. Nó cũng cung cấp hiệu suất tốt nhờ tính nhất quán yếu - các phần chèn có thể được thực hiện một cách an toàn trong khi bạn đang lặp qua Set, nhưng không có gì đảm bảo rằng Iterator của bạn sẽ nhìn thấy phần chèn đó.


1

ConcurrentSkipListMap là một phát hiện tuyệt vời khi tôi cần triển khai một lớp nhân bản cho bộ nhớ cache tự phát triển. Các khía cạnh Bản đồ đã triển khai bộ nhớ cache và các khía cạnh Danh sách cơ bản cho phép tôi theo dõi thứ tự các đối tượng xuất hiện trong bộ đệm. Khía cạnh "bỏ qua" của danh sách đó làm cho việc loại bỏ một đối tượng khỏi một vị trí trong danh sách và đẩy nó đến cuối khi nó được thay thế trong bộ nhớ cache hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.