在Java中,是Collections.sort()线程安全使用的Comparator吗?

时间:2010-05-21 17:59:42

标签: java thread-safety comparator

如果我创建一个Comparator的单个实例,那么可以跨多个线程使用该实例来使用Collections.sort()对集合进行排序吗?或者,我是否需要为每次调用Collections.sort()创建一个新的Comparator实例以确保线程安全?

3 个答案:

答案 0 :(得分:22)

这完全取决于您如何实施Comparator。例如,如果它具有写入的实例变量或者在比较期间隐式更改其内容,则它将不是线程安全的。

大多数Comparator实现都不会这样做,但可能合理发生的一种情况是使用SimpleDateFormat来比较表示日期的字符串。不幸的是,SimpleDateFormat本身并不是线程安全的。

答案 1 :(得分:5)

Comparator是一个接口,它没有固有的并发属性。如果您的实现是线程安全的,那么这取决于您如何编写它。如果它所做的一切都局限于比较方法的范围(无实例或类级别状态),并且它使用的所有资源都是线程安全的,那么它本身就是线程安全的。

答案 2 :(得分:0)

如果我找到一个非线程安全的比较器,我会非常惊讶,因为它们通常(总是?)可重入。

并发问题是在排序发生时正在更改正在排序的集合。