我有一个 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/