是否可以使用ConcurrentHashMap作为支持来实现非阻塞线程安全列表,您可以将索引用作键,将元素用作值?
答案 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)
不,因为没有办法以原子方式移除元素。
您可以实现代码以将后续元素向下移动一个,但这需要一些额外的编码。