gpt4 book ai didi

java - 并发集合队列

转载 作者:IT老高 更新时间:2023-10-28 20:59:00 24 4
gpt4 key购买 nike

也许这是一个愚蠢的问题,但我似乎找不到一个明显的答案。

我需要一个仅包含唯一值的并发 FIFO 队列。尝试添加队列中已经存在的值只会忽略该值。如果不是为了线程安全,那将是微不足道的。是否有 Java 中的数据结构或互联网上的代码片段表现出这种行为?

最佳答案

如果您想要比完全同步更好的并发性,我知道有一种方法可以做到这一点,即使用 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;
}
}

采用这种方法,一切都不是阳光。除了使用 backing map 的 entrySet().iterator().next() 之外,我们没有合适的方法来选择 head 元素,结果是随着时间的推移,map 变得越来越不平衡.由于更大的桶冲突和更大的段争用,这种不平衡是一个问题。

注意:此代码使用 Guava在几个地方。

关于java - 并发集合队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3120495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com