我需要使用将被并发访问的有序映射(迭代器可能正在读取地图,而另一个线程将添加新条目)。
到目前为止,我已经找到了两种方法:使用Collections.synchronizedSortedMap(new TreeMap())或使用ConcurrentSkipListMap。
一种方法相对于另一种方法有哪些优点和缺点? ConcurrentSkipListMap似乎更容易使用,但我应该考虑其他因素?
答案 0 :(得分:4)
一般来说,并发集合提供比同步集合更好的可伸缩性,但同步集合允许您锁定整个集合,而并发集合则不允许。
您是否需要其中一种取决于您的使用案例。
迭代器可能正在读取地图,而另一个线程将添加新条目
然后你可能不想使用Collections.synchronizedSortedMap(new TreeMap())
,因为它需要在迭代时锁定整个地图。
另一方面,ConcurrentSkipListMap提供了弱一致的迭代器(即在开始迭代之前拍摄地图快照的迭代器,允许您在迭代期间修改地图而没有副作用)。