在数组中允许线程不安全

时间:2012-03-12 03:12:34

标签: java arrays image-processing concurrency

我有一个Java应用程序正在执行一些实时图像处理,图像数据存储在大型int数组中。

图像阵列部分的更新不断地从多个线程发生(这基本上是为了显示非常大量的传入事件流)。

读者需要复制图像阵列的部分内容以供显示和/或进一步处理。

由于需要高吞吐量,我希望避免任何昂贵的同步来处理并发访问。此外,偶尔可以容忍小的视觉错误,例如,如果读者复制图像的一部分,该部分仅针对给定的传入事件进行了部分更新。基本上我想做的是放松螺纹安全性以确保最大的吞吐量。

这种方法是否有效?我应该注意哪些问题?

1 个答案:

答案 0 :(得分:1)

据推测,您建议对数组进行分区,并且只允许一个线程访问每个分区。这是一个没有问题的合理方法。

事实上,fork / join框架执行此操作并且可能适用于您尝试实现的内容。

e.g。查看java.util.concurrent.RecursiveAction的javadoc,其中显示了对数组进行分区以对其进行排序的示例。简而言之,数组被分区,直到分区大小低于阈值。然后再次对每个后续分区进行分区(即,递归地)。

代码如下所示:

 class SortTask extends RecursiveAction {
    final long[] array; final int lo; final int hi;
    SortTask(long[] array, int lo, int hi) {
    this.array = array; this.lo = lo; this.hi = hi;
 }

 protected void compute() {
    if (hi - lo < THRESHOLD)
       sequentiallySort(array, lo, hi);
    else {
       int mid = (lo + hi) >>> 1;
       invokeAll(new SortTask(array, lo, mid),
                 new SortTask(array, mid, hi));
       merge(array, lo, hi);
    }
  }
}