2010-12-08 61 views
1

當然,使用「synchronized」的方式顯然很明顯。 但我創建了一個系統,設計用於在多個內核上運行,並在相同的毫秒內向該文件寫入不同的次數。因此,我認爲使用同步會嚴重損害性能。 我正在考慮使用Java的管道類(但不知道它是否會有所幫助) 或讓每個線程寫入不同的文件以及收集 這些寫入的附加線程,從而創建最終結果。 我應該提到的是,文章的順序並不重要,無論如何它都以時間戳 。 這兩個更好的想法是什麼?有沒有其他建議? 謝謝。將幾個線程同步寫入到java中的同一個文件中

+0

您需要指定您以後的速度,吞吐量或等待時間。你需要在1ms內寫入10k m/s或任何給定的消息嗎?另外,如果你關心磁盤寫入的可靠性(你可以承受在處理崩潰時延遲寫入)。 – DaveC 2010-12-11 03:03:37

回答

2

使用某種同步(例如單個互斥鎖)很容易實現。

如果我有足夠的RAM,我想創建某種爲每個登錄生產者線程一個隊列,日誌消費者線程在一個循環的方式所有隊列讀取(或類似的東西) 。

1

不是你的問題的直接答案,但logback項目內置同步功能,用於從不同線程寫入同一個文件,所以如果它適合你的需要,或者至少需要一個看看它的源代碼。由於它是爲速度而構建的,所以我非常肯定實現不被視爲理所當然。

1

如果您擔心,您將無法將所有線程寫入同一個文件而沒有性能問題。當我遇到這個問題(編寫自己的日誌記錄,回到Log4j之前),我在內存中創建了兩個固定大小的緩衝區,並讓所有生產者線程寫入一個緩衝區,同時從另一個緩衝區讀取專用的使用者線程,寫信給一個文件。這樣,寫入線程只需在獲取索引和將索引遞增到緩衝區並同步緩衝區時進行同步,並且只在當前緩衝區滿時阻塞。這是內存密集型,但速度很快。

對於其他想法,你可以看看Log4j和Logback這樣的記錄器如何工作,他們將不得不解決這個問題。

1

嘗試使用JMS。您在不同機器上運行的所有進程都可能發送JMS消息,而不是寫入文件。只創建一個接收消息並將它們寫入文件的隊列接收器。 Log4J已經具有這種功能:請參閱JMSAppender。