2012-03-12 16 views
0

我有一个Java应用程序正在执行一些实时图像处理,图像数据存储在大的int数组中。允许线程不安全在数组中

从多个线程不断更新图像阵列的各个部分(这主要是为了可视化传入事件的大量数据流)。

读者需要获取图像数组部分的副本以供显示和/或进一步处理。

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

这种方法行得通吗?任何我应该知道的陷阱?

+1

是用什么办法去上班?你说你想“放松”同步,但听起来好像你会完全移除它。然后你会遇到所有已知的多线程代码没有同步的问题(线程覆盖彼此的工作等) – Thomas 2012-03-12 03:49:02

回答

1

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

事实上,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); 
    } 
    } 
}