java.util.Comparator.compare(T o1,T o2)的实现是否应该是线程安全的?

时间:2015-07-30 07:36:32

标签: java multithreading comparator

或者我应该只关注在java.util.Arrays.parallelSort(T[] a, Comparator<? super T> cmp)等并行实现中使用?

3 个答案:

答案 0 :(得分:5)

比较方法本质上是针对对象评估的纯函数,至少在排序操作期间这些对象可以被认为是不可变的。在排序过程中对对象进行变换会破坏任何排序算法的基本假设,即Comparator强加的顺序在整个操作过程中都是稳定的。

以上暗示,尽管比较器在并行排序中使用时必须是线程安全的,但通常不需要特别的努力。另一方面,您需要确保它出于某种原因不包含线程不安全的代码,例如使用在compare()的所有调用中共享的线程不安全的协作者实例。

答案 1 :(得分:0)

让线程安全的东西总是一个好主意。与其他答案相反,IMO可能是非线程安全的,例如,当Comparator使用像SimpleDateFormat这样的对象作为成员变量时,它不是线程安全的。

由于使用比较器的人不会期望必须处理并发性,因此将其设置为线程安全肯定是个好主意。

答案 2 :(得分:0)

你是对的。虽然在大多数情况下,比较器在设计时是线程安全的,或者在单线程中使用,但也存在比较器可以同时使用的情况。并行排序,如您所提到的,或在并发集合中,作为ConcurrentSkipListMap

在这些情况下,显然,比较器必须是线程安全的或同步的。

相关问题