簡體   English   中英

同步寫入Java中同一文件的多個線程

[英]Synchronizing several threads writing to the same file in java

當然,有使用“同步”的明顯方法。 但是我正在創建一個旨在在多個內核上運行的系統,並在同一毫秒內多次寫入該文件。 因此,我相信使用同步會嚴重損害性能。 我當時正在考慮使用Java的Pipe類(但不確定是否會有所幫助),或者讓每個線程寫入不同的文件,並讓另一個線程收集這些著作,從而創建最終結果。 我應該指出,寫作的順序並不重要,而且無論如何它都在納米時間加蓋了時間戳。 這兩個更好的主意是什么? 還有其他建議嗎? 謝謝。

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

如果我有足夠的RAM,我將為每個日志生產者線程創建一個某種隊列,並創建一個日志消費者線程以循環方式(或類似方式)從所有隊列中讀取。

不是直接回答您的問題,但是logback項目內置了同步功能,可以從不同的線程寫入同一文件,因此,如果需要,您可以嘗試使用它,或者至少看看它的來源碼。 由於它是為提高速度而構建的,因此我很確定實現不會被視作理所當然。

您應該擔心,您將無法使所有線程寫入同一文件而不會出現性能問題。

當我遇到這個問題(寫自己的日志,在Log4j之前返回)時,我在內存中創建了兩個固定大小的緩沖區,並讓所有生產者線程寫入一個緩沖區,而專用的使用者線程則從另一個緩沖區讀取並寫入了文件。 。 這樣,編寫器線程僅需在獲取和遞增到緩沖區的索引時以及在交換緩沖區時進行同步,並且僅在當前緩沖區已滿時才阻塞。 它占用大量內存,但速度很快。

對於其他想法,您可以查看Log4j和Logback等記錄器如何工作,他們必須解決此問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM