Java线程安全:枚举和静态方法

时间:2016-07-03 10:07:25

标签: java multithreading thread-safety

我是否认为方法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();
    }
  }
...
}

2 个答案:

答案 0 :(得分:2)

如果您有两个或更多线程在&#34;同一时间访问相同数据&#34;您只能遇到线程安全问题。

您的方法操纵其参数。这意味着无论调用这些方法的线程多少次或多少次,都不应该遇到问题。

当然,除非您在相同的对象上调用这些方法。

所以,到目前为止我们看到的是线程安全的。

但是,如果你真正的代码会像

那样
List<YourObject> someObjects = ...
sortList(someObjects);
sortList(someObjects);

(基本上将同一个数组排序两次,可能同时进行)......这不是一个好主意。

答案 1 :(得分:1)

不幸的是,该方法不是线程安全的。通过计算调用中涉及的变量数量,您走在正确的道路上,但是您忘记在计数中包含函数参数。

sortList方法的问题是线程之间可能共享mylist参数,想象如果两个线程同时尝试在相反方向对列表进行排序会发生什么。