Java将int []的列表转换为int []的数组 - 并发安全

时间:2016-06-17 18:29:33

标签: java arrays multithreading list

我有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;
      }

在我的情况下,一个大问题是另一个线程正在转换过程中更改List。所以我在我的foreach上得到{​​{1}}。

还有其他方法可以像使用Streams一样吗?那将是安全的。

此致

2 个答案:

答案 0 :(得分:3)

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

但如果你把它改为例如CopyOnWriteArrayList它会更容易,您可以安全地迭代它,而其他线程将写入它(但您将只复制启动foreach / iterator时的列表状态,对List的所有更改在你做另一个foreach / iterator之前不会反映出来。

答案 1 :(得分:2)

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