我有一个Java应用程序正在执行一些实时图像处理,图像数据存储在大型int数组中。
图像阵列部分的更新不断地从多个线程发生(这基本上是为了显示非常大量的传入事件流)。
读者需要复制图像阵列的部分内容以供显示和/或进一步处理。
由于需要高吞吐量,我希望避免任何昂贵的同步来处理并发访问。此外,偶尔可以容忍小的视觉错误,例如,如果读者复制图像的一部分,该部分仅针对给定的传入事件进行了部分更新。基本上我想做的是放松螺纹安全性以确保最大的吞吐量。
这种方法是否有效?我应该注意哪些问题?
答案 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);
}
}
}