实现非阻塞线程安全列表

时间:2015-05-24 11:13:52

标签: java list thread-safety nonblocking

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

3 个答案:

答案 0 :(得分:2)

有可能吗?

答案是它取决于您需要的列表功能。

  • 如果您只是想在"列表中执行类似数组的操作" (例如,在给定索引处获取或设置元素),然后就可以完成。

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

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

答案 1 :(得分:1)

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

    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

答案 2 :(得分:0)

不,因为没有办法以原子方式移除元素。

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