[英]Reading and Writing in Parallel in Java
我在以“共享模式”讀取和寫入文件時遇到問題。 我的應用程序需要的是能夠以共享模式訪問文件 - 或打開 - 以便如果一個線程正在寫入文件,則另一個線程應該能夠從中讀取。 我見過java.nio.channels.FileLock ,但它有一個問題,我引用
那么在“共享模式”下訪問文件還有什么其他解決辦法? 允許多次讀取訪問並在寫入時讀取,反之亦然。 如果我可以在打開文件時指定模式,那將會很棒。
希望一切都清楚..
PS我正在使用jdk 1.6,因此不支持java.nio.Files。
如果要同步線程,則可以使用Java並發類。 有一個讀寫鎖的實現:
ReentrantReadWriteLock JavaDoc 7
ReentrantReadWriteLock JavaDoc 5
文檔提供了一個使用示例。 當然,您還需要FileLock
來跨進程同步。
第二個示例可能對您最有用,但不是訪問集合,而是訪問您的文件。 您的FileLock
操作將進入ReentrantReadWriteLock
鎖定代碼。
FileLock用於協調與其他進程的文件訪問。
您不需要它(也沒有幫助)來協調您自己進程的線程之間的文件訪問。
如果我理解正確的話,你應該對文件進行獨占鎖定以防止其他程序在你的Java程序工作時弄亂它,然后在你的應用程序代碼中以某種方式確保你所擁有的各種線程沒有步驟在每個人的腳上。
后者可以使用Java線程同步完成。
第一個想法:
這個解決方案怎么樣...每個線程都有自己的java.io.RandomAccessFile
實例,在"rws"
(或"rwd"
)模式下用於更新操作,而"r"
模式用於只讀操作。
由於java.io.RandomAccessFile
沒有緩沖(緩存),並且由於更新程序的"rws"
(或"rwd"
)模式,因此它們都“看到”彼此之間的更改。
當然,你仍然需要在你的應用程序/庫/框架中控制線程不會無意中覆蓋彼此的更改(想想atomic / compareAndSwap更新)並搞砸了。
第二個想法:
為了獲得更好的性能 ,當您的應用程序(單個流程實例)是文件的唯一訪問者時,您可以使用一個關心緩沖和同步的小層來抽象文件。 可能已經在某個地方實施了......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.