我是否认为方法sortList(参见下面的伪代码)是线程安全的?
我理解“是”,因为这里没有任何变数,但我必须确定。伪代码:
//This method should be thread-safe
public static void sortList (List<MyObject> list, SortType sortType) {
Collections.sort(list, sortType.getComparator());
}
//Defines type of sorting
public static enum SortType {
BY_FIELD_1 (new ComparatorByField1()),
BY_FIELD_2 (new ComparatorByField2()),
...
BY_FIELD_N (new ComparatorByFieldN());
private comparator;
private SortType (Comparator comparator) {
this.comparator = comparator;
}
public getComparator () {
return comparator;
}
//Method getFieldX in pseudo-code bellow returns a number
private static class ComparatorByField1 implements Comparator<MyObject> {
public int compare (MyObject o1, MyObject o2) {
return (int) (o1.getField1() - o2.getField1());
}
}
...
private static class ComparatorByFieldN implements Comparator<MyObject> {
public int compare (MyObject o1, MyObject o2) {
return (int) (o1.getFieldN() - o2.getFieldN();
}
}
...
}
答案 0 :(得分:2)
如果您有两个或更多线程在&#34;同一时间访问相同数据&#34;您只能遇到线程安全问题。
您的方法仅操纵其参数。这意味着无论调用这些方法的线程多少次或多少次,都不应该遇到问题。
当然,除非您在相同的对象上调用这些方法。
所以,到目前为止我们看到的是线程安全的。
但是,如果你真正的代码会像
那样List<YourObject> someObjects = ...
sortList(someObjects);
sortList(someObjects);
(基本上将同一个数组排序两次,可能同时进行)......这不是一个好主意。
答案 1 :(得分:1)
不幸的是,该方法不是线程安全的。通过计算调用中涉及的变量数量,您走在正确的道路上,但是您忘记在计数中包含函数参数。
sortList方法的问题是线程之间可能共享mylist
参数,想象如果两个线程同时尝试在相反方向对列表进行排序会发生什么。