【问题标题】:Implementing nonblocking thread-safe list实现非阻塞线程安全列表
【发布时间】:2015-05-24 11:13:51
【问题描述】:

是否可以使用 ConcurrentHashMap 作为支持来实现非阻塞线程安全列表,其中使用索引作为键,元素作为值?

【问题讨论】:

标签: java list thread-safety nonblocking


【解决方案1】:

有可能吗?

答案是这取决于您需要什么列表功能。

  • 如果您只是想对“列表”执行类似数组的操作(例如,在给定索引处获取或设置元素),则可以这样做。

  • 如果你想做一些事情,比如插入或删除元素,或者按顺序迭代列表中的元素,那么操作必须是阻塞的,而且通常会很昂贵。

为了说明,考虑在位置P 插入元素的问题。为此,您需要更改 P 及以后的所有现有元素的位置。对于每一个,您都需要从 hashmap 中删除元素,然后重新插入。假设P 是随机选择的,那么重新编号为O(N),其中N 是“列表”长度。此外,重新编号必须以原子方式完成,因此它必须在相当长的时间内阻止其他操作。

【讨论】:

    【解决方案2】:

    当然可以。 javadoc 提供了有关如何使用它的信息。
    1.操作是线程安全的:HashMap被阻塞,操作被执行,HashMap被解除阻塞等等
    2. getter 没有阻塞:它检索最近的更新
    3. 您可以使用 function
    扩展您的 HashMap 4. 使用 put(key, values);
    添加元素 5. 你在找

        ConcurrentHashMap<Integer,String> map = new ConcurrentHashMap<Integer,String> (); //Creates a new, empty map with a default
                                      // initial capacity (16), load factor (0.75) and concurrencyLevel (16).
        map.put(map.size(),"Hello"); //put is blocking so you'll have the actual size (your index) at insertion time
    

    【讨论】:

      【解决方案3】:

      不,因为没有办法自动删除元素。

      您可以实现代码以将后续元素向下移动一个,但这需要一些额外的编码。

      【讨论】:

        猜你喜欢
        • 2011-05-12
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 1970-01-01
        • 2019-02-12
        • 1970-01-01
        相关资源
        最近更新 更多