我需要使用将被并发访问的排序映射(迭代器可能正在读取映射,而另一个线程将添加新条目)。
到目前为止,我已经找到了两种方法,一种是使用 Collections.synchronizedSortedMap(new TreeMap())或使用 ConcurrentSkipListMap .
一种方法相对于另一种方法的优缺点是什么? ConcurrentSkipListMap 似乎更容易使用,但我还应该考虑哪些其他因素?
最佳答案
一般来说,并发集合比同步集合提供更好的可伸缩性,但同步集合允许您锁定整个集合,而并发集合则不能。
您是否需要其中一个取决于您的用例。
an iterator may be reading through the map while another thread will add new entries
那么您可能不想使用 Collections.synchronizedSortedMap(new TreeMap())
,因为它需要在迭代时锁定整个 map 。
另一方面,ConcurrentSkipListMap 提供弱一致性迭代器(即迭代器在开始迭代之前拍摄映射的快照,允许您在迭代期间修改映射而没有副作用)。
关于java - Collections.synchronizedSortedMap 与 ConcurrentSkipListMap 用于并发使用的排序映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18078225/