简短结论:java.util.Comparator 本身只是一个接口,谈“线程安全”要看具体实现,而不是接口本身。
下面分几种情况说明:
Comparator 只定义了一个方法(如 compare(T o1, T o2)),接口本身不涉及状态,也不保证线程安全。
public interface Comparator<T> {
int compare(T o1, T o2);
}
是否线程安全,取决于:
compare() 中是否被读写最常见的写法:
Comparator<Integer> c = (a, b) -> a - b;
或
Comparator<String> c = Comparator.comparing(String::length);
✅ 特点:
Java 标准库里的很多
Comparator(如Comparator.comparing、naturalOrder)都是无状态的,线程安全。
例如:
class CounterComparator implements Comparator<Integer> {
private int count = 0;
@Override
public int compare(Integer a, Integer b) {
count++; // 修改共享状态
return a - b;
}
}
❌ 问题:
count 被多线程并发修改✅ 解决方案:
AtomicIntegersynchronizedCollections.sort / List.sort
parallelStream().sorted(comparator)
compare✅ Comparator 接口本身无所谓线程安全
✅ 无状态 Comparator 线程安全(推荐)
❌ 有状态的 Comparator 默认不安全
如果你愿意,可以贴一段你正在用的 Comparator 代码,我可以直接帮你判断是否线程安全。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。