List<Integer> contacts = new Vector<Integer>();
Collections.sort(contacts);
好的,我知道向量是线程安全的,但是如果我执行上述操作有什么问题吗?
List<Integer> contacts = new Vector<Integer>();
Collections.sort(contacts);
好的,我知道向量是线程安全的,但是如果我执行上述操作有什么问题吗?
您可以使用以下方法使此代码线程安全:
List<Integer> contacts = new Vector<Integer>();
synchronized(contacts) {
Collections.sort(contacts);
}
矢量是线程安全的
它的每个方法都是线程安全的。但是Collections.sort
会遍历不是原子操作的向量。特别是,Vector 的 javadoc指出:
如果在迭代器创建后的任何时候对向量进行了结构修改,除了通过迭代器自己的 remove 或 add 方法之外,迭代器将抛出 ConcurrentModificationException。
所以如果你的向量在你排序的时候被另一个线程修改了,你会得到一个异常。
如果多个线程可以访问您的结构,则替代方案包括:制作防御性副本或使用并发结构,例如 CopyOnWriteArrayList。
使用 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))