栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

并发设置队列

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

并发设置队列

如果您想要比完全同步更好的并发性,那么我知道有一种方法可以使用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元素,结果是随着时间的流逝,该图变得越来越不平衡。由于更大的存储桶冲突和更大的段争用,这种不平衡是一个问题。

注意:此代码在一些地方使用了番石榴。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496223.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号