Nếu bạn muốn đồng thời tốt hơn đồng bộ hóa đầy đủ, có một cách tôi biết để làm điều đó, sử dụng ConcurrentHashMap làm bản đồ sao lưu. Sau đây chỉ là một bản phác thảo.
public final class ConcurrentHashSet<E> extends ForwardingSet<E>
implements Set<E>, Queue<E> {
private enum Dummy { VALUE }
private final ConcurrentMap<E, Dummy> map;
ConcurrentHashSet(ConcurrentMap<E, Dummy> map) {
super(map.keySet());
this.map = Preconditions.checkNotNull(map);
}
@Override public boolean add(E element) {
return map.put(element, Dummy.VALUE) == null;
}
@Override public boolean addAll(Collection<? extends E> newElements) {
// just the standard implementation
boolean modified = false;
for (E element : newElements) {
modified |= add(element);
}
return modified;
}
@Override public boolean offer(E element) {
return add(element);
}
@Override public E remove() {
E polled = poll();
if (polled == null) {
throw new NoSuchElementException();
}
return polled;
}
@Override public E poll() {
for (E element : this) {
// Not convinced that removing via iterator is viable (check this?)
if (map.remove(element) != null) {
return element;
}
}
return null;
}
@Override public E element() {
return iterator().next();
}
@Override public E peek() {
Iterator<E> iterator = iterator();
return iterator.hasNext() ? iterator.next() : null;
}
}
Tất cả đều không có ánh nắng mặt trời với cách tiếp cận này. Chúng tôi không có cách nào tốt để chọn yếu tố đầu khác ngoài việc sử dụng bản đồ sao lưu entrySet().iterator().next()
, kết quả là bản đồ càng ngày càng mất cân bằng khi thời gian trôi qua. Sự mất cân đối này là một vấn đề cả do va chạm xô lớn hơn và tranh chấp phân khúc lớn hơn.
Lưu ý: mã này sử dụng Guava ở một vài nơi.
Nguồn
2010-06-25 21:06:10
Đáng tiếc là thuật ngữ "hàng đợi" rất mơ hồ, như một số người đọc nó mặc nhiên có nghĩa là "hàng đợi FIFO", trong khi những người khác nó có ý nghĩa tổng quát hơn 'java.util.Queue', về cơ bản có nghĩa là bất kỳ bộ sưu tập nào có * một số * khái niệm về" phần tử đầu ", cho dù phần tử đó có phải là phần tử đầu tiên hay không. Vì thế! Đó là nó? –
FIFO, xin lỗi về thiếu sót =) –