0
List<Integer> contacts = new Vector<Integer>();

Collections.sort(contacts);

好的,我知道向量是线程安全的,但是如果我执行上述操作有什么问题吗?

4

3 回答 3

2

您可以使用以下方法使此代码线程安全:

List<Integer> contacts = new Vector<Integer>();

synchronized(contacts) {
  Collections.sort(contacts);
}
于 2012-11-15T19:48:35.150 回答
2

矢量是线程安全的

它的每个方法都是线程安全的。但是Collections.sort会遍历不是原子操作的向量。特别是,Vector 的 javadoc指出:

如果在迭代器创建后的任何时候对向量进行了结构修改,除了通过迭代器自己的 remove 或 add 方法之外,迭代器将抛出 ConcurrentModificationException。

所以如果你的向量在你排序的时候被另一个线程修改了,你会得到一个异常。

如果多个线程可以访问您的结构,则替代方案包括:制作防御性副本或使用并发结构,例如 CopyOnWriteArrayList。

于 2012-11-15T18:57:20.760 回答
0

使用 Collections.sort(anything) 是一件非常幼稚的事情。

如果您查看排序方法签名,您会看到它们都在列表上运行,但不能保证是线程安全的: sort(List<T> list) sort(List<T> list, Comparator<? super T> c)

即使您使用像 Vector 这样的旧对象(在 Java 历史中是旧的),您的代码也容易出现风险,因为下一个开发人员(或者甚至您自己)可能会决定使用 ArrayList 来代替。

sort 具有破坏性行为,即它正在修改底层集合,并且未能同步它可能会导致您出现以下情况:

java.util.ConcurrentModificationException: null at java.util.ArrayList.sort (...)

同步代码可能有点棘手,后来的 java 实现提供了许多功能来“手动同步”你的代码。

所以我要做的是:

Collections.sort (Collections.synchronizedList (myList))

于 2017-04-06T09:57:52.583 回答