22

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

4

3 回答 3

26

这完全取决于您如何实现Comparator. 例如,如果它有实例变量被写入或在比较期间其内容被隐式更改,那么它就不是线程安全的。

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

于 2010-05-21T18:04:34.117 回答
5

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

于 2010-05-21T18:01:50.267 回答
0

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

如果在排序发生时正在更改正在排序的集合,则会出现并发问题。

于 2010-05-21T18:04:11.043 回答