2012-03-12 19 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); 
    } 
    } 
}