在Java中,ConcurrentHashMap
在这里是更好的multithreading
解决方案。那我什么时候应该使用ConcurrentSkipListMap
?这是多余的吗?
这两者之间的多线程方面是否常见?
这两个类在某些方面有所不同。
ConcurrentHashMap不能保证*其操作的运行时间是合同的一部分。它还允许调整某些负载因子(大约是同时修改它的线程数)。
ConcurrentSkipListMap,另一方面,可以保证各种操作的平均O(log(n))性能。它还不支持出于并发的考虑而进行调整。 ConcurrentSkipListMap
还具有ConcurrentHashMap
所不具备的许多操作:ceilingEntry / Key,floorEntry / Key等。它还维护一个排序顺序,如果您使用的话,则必须计算该排序顺序(费用不菲)。一个ConcurrentHashMap
。
基本上,针对不同的用例提供了不同的实现。如果需要快速添加单键/值对和快速查找单键,请使用HashMap
。如果需要更快的有序遍历并且可以承受额外的插入成本,请使用SkipListMap
。
*尽管我希望实现与O(1)插入/查找的常规哈希映射保证大致相符;忽略重新哈希]]
就性能而言,SortedMap
用作地图时-似乎慢了10到20倍。这是我测试的结果(Java 1.8.0_102-b14,win x32)
基于工作量,如果需要范围查询,与ConcurrentNavigableMap
中的同步方法相比,ConcurrentSkipListMap可能比TreeMap慢。
ConcurrentHashMap:当您要基于多线程索引的获取/输出时,仅支持基于索引的操作。获取/放置为O(1)
然后我什么时候应该使用ConcurrentSkipListMap?