Khi bạn nhận được NoSuchElementException
thì điều này có thể do không đồng bộ hóa đúng cách. Ví dụ: Bạn đang kiểm tra với it.hasNext()
nếu một phần tử có trong danh sách và sau đó cố gắng tìm nạp nó với it.next()
. Điều này có thể không thành công khi phần tử đã bị xóa ở giữa và điều đó cũng có thể xảy ra khi bạn sử dụng các phiên bản đồng bộ của API thu thập.
Vì vậy, vấn đề của bạn không thể thực sự được giải quyết bằng cách di chuyển đến ConcurrentLinkedQueue
. Bạn có thể không nhận được ngoại lệ nhưng bạn phải chuẩn bị rằng null
được trả lại ngay cả khi bạn đã kiểm tra trước khi nó không trống. (Đây vẫn là lỗi tương tự nhưng thực hiện khác.) Điều này đúng với điều kiện là không có đồng bộ hóa thích hợp trong mã CỦA BẠN có kiểm tra tính trống rỗng và phần tử truy lục trong phạm vi đồng bộ SAME.
Có một cơ hội tốt để bạn giao dịch NoSuchElementException
để có số mới NullPointerException
sau đó.
Đây có thể không phải là câu trả lời trực tiếp giải quyết câu hỏi của bạn về hiệu suất, nhưng có NoSuchElementException
trong LinkedList là lý do để di chuyển đến ConcurrentLinkedQueue
có vẻ hơi lạ.
Sửa
Một số giả mã cho việc triển khai bị hỏng:
//list is a LinkedList
if(!list.isEmpty()) {
... list.getFirst()
}
Một số giả mã cho đồng bộ thích hợp:
//list is a LinkedList
synchronized(list) {
if(!list.isEmpty()) {
... list.getFirst()
}
}
Một số mã cho đồng bộ "vỡ" (không không hoạt động như dự định). Đây có thể là kết quả của việc chuyển đổi trực tiếp từ LinkedList sang CLQ với hy vọng loại bỏ đồng bộ hóa của riêng bạn.
//queue is instance of CLQ
if(!queue.isEmpty()) { // Does not really make sense, because ...
... queue.poll() //May return null! Good chance for NPE here!
}
Một số mã đúng:
//queue is instance of CLQ
element = queue.poll();
if(element != null) {
...
}
hoặc
//queue is instance of CLQ
synchronized(queue) {
if(!queue.isEmpty()) {
... queue.poll() //is not null
}
}
Nguồn
2011-09-06 08:42:32
Rất giống với http://stackoverflow.com/questions/4724995/lock-free-concurrent-linked-list- trong java. –