简短结论:java.util.Comparator 本身是否“线程安全”,取决于它的实现,而不是接口本身。
下面分几种情况说明:
Comparator 只是一个函数式接口,只定义了方法(如 compare(T o1, T o2))。
compare 方法:
✅ 那么它是 线程安全的(无状态)
例如:
Comparator<Integer> c = (a, b) -> a - b;
多线程调用完全没问题。
如果 Comparator 保存了可变状态,就可能不安全。
例如:
class BadComparator implements Comparator<Integer> {
private int count = 0;
public int compare(Integer a, Integer b) {
count++; // 有状态
return a - b;
}
}
问题:
count 被多个线程共享✅ 解决方式:
AtomicInteger / synchronizedList<Integer> list = ...
list.sort(comparator); // 多线程各自排序自己的 list
只要:
就是安全的。
// 多线程同时修改同一个 TreeMap
TreeMap<String, String> map = new TreeMap<>(comparator);
如果:
都会出问题。
Comparator.naturalOrder()Comparator.comparing(...)Integer::compare✅ 都是 无状态、线程安全
| 情况 | 是否线程安全 |
|---|---|
| 无状态 Comparator | ✅ 安全 |
| 有可变状态 Comparator | ❌ 不安全 |
| JDK 内置 Comparator | ✅ 安全 |
| 多线程共享可变 Comparator | ❌ 需同步 |
如果你愿意,可以贴一段你的 Comparator 代码,我可以直接帮你判断是否安全。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。