【发布时间】:2015-05-24 11:13:51
【问题描述】:
是否可以使用 ConcurrentHashMap 作为支持来实现非阻塞线程安全列表,其中使用索引作为键,元素作为值?
【问题讨论】:
-
是的,可以在此处使用 ConcurrentDictionary 检查。 stackoverflow.com/a/59500222/10743316
标签: java list thread-safety nonblocking
是否可以使用 ConcurrentHashMap 作为支持来实现非阻塞线程安全列表,其中使用索引作为键,元素作为值?
【问题讨论】:
标签: java list thread-safety nonblocking
有可能吗?
答案是这取决于您需要什么列表功能。
如果您只是想对“列表”执行类似数组的操作(例如,在给定索引处获取或设置元素),则可以这样做。
如果你想做一些事情,比如插入或删除元素,或者按顺序迭代列表中的元素,那么操作必须是阻塞的,而且通常会很昂贵。
为了说明,考虑在位置P 插入元素的问题。为此,您需要更改 P 及以后的所有现有元素的位置。对于每一个,您都需要从 hashmap 中删除元素,然后重新插入。假设P 是随机选择的,那么重新编号为O(N),其中N 是“列表”长度。此外,重新编号必须以原子方式完成,因此它必须在相当长的时间内阻止其他操作。
【讨论】:
当然可以。 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
【讨论】:
不,因为没有办法自动删除元素。
您可以实现代码以将后续元素向下移动一个,但这需要一些额外的编码。
【讨论】: