Array.Sort 不是线程安全的:并发调用同一数组实例会导致数据错乱、越界异常或崩溃;官方明确标注其静态和实例方法均不保证线程安全,需通过独立副本、lock 或并行LINQ等方式保障安全。
直接回答:对同一个 Array 实例并发调用 Array.Sort 会导致未定义行为,包括数据错乱、越界异常甚至进程崩溃。.NET 官方文档明确标注 Array.Sort 的静态重载「不是线程安全的」,实例方法(如 Array.Sort)同样不保证线程安全。
常见误用包括:
Array.Sort
Sort)Array.Sort 配合自定义 IComparer,而该比较器内部访问了共享可变状态(如静态字段、缓存字典)这类情况不会抛出明确的「线程不安
全」异常,而是表现为排序结果错误、IndexOutOfRangeException 或偶尔的 ArgumentException(例如“array was modified”)。
没有银弹,但有明确可行路径:
int[] original = { 3, 1, 4 };
int[] copy = (int[])original.Clone();
Array.Sort(copy); // 安全lock 保护共享数组(仅适用于低频、小数组):private static readonly object sortLock = new object();
lock (sortLock) { Array.Sort(sharedArray); }List 并用 AsParallel().OrderBy()(注意:这会创建新序列,不就地排序)根本原因在于性能与语义权衡:
Array.Sort 使用的是 introsort(快排 + 堆排 + 插入排序混合),过程中需要频繁交换原数组元素,加锁会严重拖慢速度真正容易被忽略的是:即使你只读数组,只要另一个线程正在调用 Array.Sort,读操作也未必看到一致状态——因为排序过程中的中间态是公开可见的。