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