2012-03-14 37 views
1

因此從這個問題提示Multithreaded access to fileJava:在訪問非同步類的多個線程之間創建一箇中間人類?

我的場景是我有一個電子表格組件,其中多個線程將訪問和寫入每個工作簿。組件本身不是線程安全的,所以我正確地認爲當一個線程正在寫入時,其他線程需要被阻塞,直到第一個線程完成寫入爲止。當我處理非線程安全類時,我將如何實現這一目標?把寫入方法放在同步塊中?

這引發的另一個問題是,如果一個線程忙於將長行數據寫入其相應的工作簿,那麼另一個線程將不得不停止在它的軌道上,直到第一個線程完成爲止,這是不可取的。我想象一個場景,其中每個線程運行時不會互相阻塞,但寫入電子表格的數據由另一箇中間人類完成,這個中間人類將緩衝並將數據刷新到電子表格組件上,而不會導致多個線程「等待」直到他們的寫作過程完成。

基本上每個線程做它自己的兩件事情。 1)對來自各個源的數據執行一些長時間運行的處理,2)將處理後的數據寫入電子表格。我正在尋求一種併發解決方案,其中1)由於2)而沒有面臨「等待」。

回答

1

的最佳解決方案真的取決於你的電子表格上執行的操作類型。例如,如果一個線程需要讀取被另一個線程寫入的值,那麼它可能需要以時間來鎖定或者整個電子表格或至少特定行。由於電子表格本身不是線程安全的,因此您需要進行自己的同步是正確的。

如果對所有訪問進行序列化很重要(這會損害性能,因爲它擺脫了並行性),請考慮使用線程安全隊列,其中每個線程都將一個對象添加到表示要執行的操作的隊列中。然後,可以讓工作線程將項目從隊列中取出(再次,以線程安全的方式,因爲隊列是線程安全的)並執行操作。

可能有一間屋子並行隊列的工人,因爲他們可以相互通信,並做一些基於行的鎖定在他們之間。例如,如果第一操作是將讀取的行1-4和寫入到行5,第二操作是讀取來回行6-10和寫入到行11,那麼這些應該能夠並行地執行。但在這裏要小心,因爲它可能取決於電子表格的基礎結構,您認爲這不是線程安全的。儘管如此,讀取操作很可能並行執行。

儘管不重要,但同步對隊列的訪問是基本的讀寫器問題,雖然您必須確保避免捱餓和死鎖,但要比隨機訪問更容易考慮電子表格。

這就是說,最好的解決辦法是使用一個線程安全的電子表格,或只使用一個線程曾經訪問它。爲什麼不使用數據庫支持的電子表格,然後讓多個線程一次讀取/寫入數據庫?

相關問題