在 Java 里,Comparator 本身只是“比较规则”,它通常是无状态、线程安全的(只要你不往里面写共享变量)。
所以“Comparator 多线程”一般分 3 种常见场景,我按使用频率来讲。
每个线程用自己的数据 + 同一个 Comparator:
Comparator<Integer> cmp = Integer::compareTo;
List<Integer> list = new ArrayList<>(Arrays.asList(3,1,2));
list.sort(cmp); // 线程内使用
✅ 线程安全(Comparator 无状态)
⚠️ 注意:parallelStream().sorted() 实际上还是会退化为单线程排序
List<Integer> list = ...
list.parallelStream()
.sorted(cmp)
.collect(Collectors.toList());
✅ Comparator 必须线程安全
❌ 性能提升有限(排序本身不适合并行)
class BadComparator implements Comparator<Integer> {
private int count = 0; // 共享变量
public int compare(Integer a, Integer b) {
count++; // 多线程不安全
return a - b;
}
}
问题:
count 不是线程安全的compare✅ 解决方式:
AtomicIntegerComparator<Person> cmp = (p1, p2) ->
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
.compare(p1, p2);
然后在多线程中:
executor.submit(() -> {
list.sort(cmp);
});
✅ 完全线程安全
Arrays.sort / List.sortList<Integer> part1 = ...
List<Integer> part2 = ...
CompletableFuture<List<Integer>> f1 = CompletableFuture.supplyAsync(() -> {
part1.sort(cmp);
return part1;
});
CompletableFuture<List<Integer>> f2 = CompletableFuture.supplyAsync(() -> {
part2.sort(cmp);
return part2;
});
// 最后 merge(归并)
Comparator 可以多线程用,但前提是:无状态、不写共享变量
排序逻辑本身不适合并行,除非你手动分治
如果你愿意,可以告诉我:
我可以直接给你可运行的代码方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。