【问题标题】:Java convert list of int[] to array of int[] - concurrent safeJava 将 int[] 列表转换为 int[] 数组 - 并发安全
【发布时间】:2016-06-17 18:29:32
【问题描述】:

我有一个List<int[]>,我想将其转换为int[][]

我试过这样:

      private List<int[]> pos = new LinkedList<>();
      ...
      public int[][] getPos() {
        int[][] ret = new int[pos.size()][2];
        int i = 0;
        for (Object o : pos) {
          ret[i] = Arrays.stream((int[]) o).toArray();
          i++;
        }
        return ret;
      }

就我而言,最大的问题是另一个线程在转换过程中正在更改列表。所以我在我的 foreach 上得到了一个ConcurrentModificationException

还有其他方法可以像 Streams 一样做到这一点吗?那将是并发安全的。

问候

【问题讨论】:

  • 事先制作一个本地列表副本,这是线程的方式。
  • 考虑同步或锁定。

标签: java arrays multithreading list


【解决方案1】:

LinkedList 不是线程安全的,因此如果不使用锁/同步,就不可能使您的程序线程安全。

但是如果你把它改成例如CopyOnWriteArrayList 会更容易,您可以安全地迭代它,而其他线程将写入它(但您将仅复制启动 foreach/iterator 时的列表状态,对 List 的所有更改都不会反映,直到您执行另一个 foreach/iterator)。

【讨论】:

    【解决方案2】:

    更好的解决方案是使用 ConcurrentQueue。这是您可以在使用它们的同时添加值。注意:您将无法复制完成复制后生成的任何int[]

    【讨论】:

    • 就像一个快速修复的魅力。但我会进一步研究锁定/同步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多