繁体   English   中英

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

[英]Java thread-safety: enum and static methods

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

如果您有两个或更多线程“同时”访问相同数据,则只能出现线程安全问题。

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

当然,除非你在同一个对象上调用这些方法。

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

但是,如果你真正的代码会做类似的事情

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM