java - 允许数组中的线程不安全

标签 java arrays image-processing concurrency

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

多个线程不断更新图像数组的某些部分(这基本上是为了可视化大量传入事件流)。

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

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

这种方法行得通吗?有什么我应该注意的问题吗?

最佳答案

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

事实上,fork/join 框架就是这样做的,并且可能适用于您想要实现的目标。

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

代码如下所示:

 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);
    }
  }
}

关于java - 允许数组中的线程不安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9661328/

相关文章:

javascript - 映射具有两种不同样式的数组=奇数数组具有一种样式,偶数数组具有另一种样式

c++ - 尝试将数组作为参数传递,出现 double[4] 到 double 转换错误

r - 如何从R中的灰度图像获取像素矩阵?

java - 循环程序在完成检查后再次启动

java - 如何在jME3中定位球体上的纹理?

javascript - 使用循环在 Javascript 中创建 <tr>

image-processing - D的图像处理库?

c++ - 检测两幅图像之间的差异

java - 使用集合与优先级队列实现的二叉堆的渐近复杂性

java - 更改 TableView 中的表列背景,同时保留交替的行颜色?