如果您想要比完全同步更好的并发性,那么我知道有一种方法可以使用ConcurrentHashMap作为支持映射。以下仅为草图。
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; }}用这种方法,一切都不是阳光。除了使用背景图之外
entrySet().iterator().next(),我们没有其他合适的方法来选择head元素,结果是随着时间的流逝,该图变得越来越不平衡。由于更大的存储桶冲突和更大的段争用,这种不平衡是一个问题。
注意:此代码在一些地方使用了番石榴。



