Arrays.sort()非线程安全,多线程并发调用同一数组会导致数据错乱;应避免共享数组、使用副本排序,或加同步锁,必要时改用线程安全容器。

Arrays.sort() 本身不是线程安全的,它直接修改原数组,且内部没有同步机制。多线程环境下并发调用同一数组的 sort() 会导致不可预测结果,甚至数据错乱。要实现线程安全,关键不是“改造sort”,而是规避共享状态或加控制。
避免共享数组是首选方案
最简单也最推荐的做法:让每个线程操作自己的数组副本,不共享原始数组。
- 使用 Arrays.copyOf() 或 clone() 创建独立副本再排序
- 例如:
int[] localCopy = Arrays.copyOf(original, original.length); Arrays.sort(localCopy); - 适用于大多数场景,尤其是排序后仅读取、不回写原数组的情况
必要时加显式同步
如果必须对同一数组排序(如全局缓存更新),需手动加锁保证互斥。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 用 synchronized 块包裹 sort 调用,锁对象建议是数组本身或专用锁对象
- 示例:
synchronized (sharedArray) { Arrays.sort(sharedArray); } - 注意:锁粒度影响并发性能,避免在锁内做耗时操作
用不可变或线程安全容器替代
若业务允许,从源头避免可变共享数组。
立即学习“Java免费学习笔记(深入)”;
- 改用 List 配合 Collections.unmodifiableList() 或 CopyOnWriteArrayList
- 排序前转为新 List:
List<integer> sorted = new ArrayList(list); Collections.sort(sorted);</integer> - 虽不直接用 Arrays.sort,但更符合并发编程习惯
注意稳定性与算法差异
线程安全不等于排序行为一致——还要留意不同数组类型的底层算法:
- 基本类型数组(int[]等) 用双轴快排,不稳定;并发修改可能破坏分区逻辑
- 对象数组(String[]等) 默认用 Timsort,稳定但依赖元素间比较一致性
- 传 Comparator 时,确保其 compare() 方法是线程安全的(无共享可变状态)

















