2008-11-19 129 views
11

我們有一個多線程的java程序。多線程將寫入一個文件,並且一個線程將從該文件讀取。我正在尋找一些設計思路。同步是否必要?多線程訪問文件

回答

5

我會考慮在這種情況下的同步。想象一下,2個線程(t1和t2)同時打開文件並開始寫入。第一個線程執行的更改由第二個線程覆蓋,因爲第二個線程是最後一個將更改保存到文件。當線程t1正在寫入文件時,t2必須等到t1完成它的任務之後才能打開它。另外,如果您關心文件的最新可能更新,則應該將寫入線程與讀取文件的線程同步,以便在有任何線程寫入文件時,讀取線程應該等待。

0

一旦多個線程訪問共享數據,那麼同步是必要的。如果多個線程在沒有某種形式的鎖定的情況下寫入相同的文件,那麼最終可能會導致丟失的更新問題。

閱讀是不是,所以你需要考慮......如果一個線程讀取該文件,並在同一時間的另一個線程更新文件中的所有情況一樣大的問題,不讀線程需要了解的變化?如果是這樣,您還需要鎖定閱讀線程的文件。

0

,如果你有讀者和作家或作家和作家的混合您需要同步(鎖定)。如果你只有讀者,你不需要任何同步。

你不想兩個進程寫入同一個文件或一個過程寫另一個正在讀的文件。

1

如果你想多讀者和一位作家,你會尋找一個Read Write Lock或讀取寫入的互斥。

但是你想要多個作家和一個閱讀器。你怎麼知道這些作家不會覆蓋其他數據?他們以某種方式隔離?

+0

另外,考慮製作R/W鎖公平以防止讀者捱餓作家。 – 2008-11-19 19:32:10

2

如果是同步並不重要,你可以有你的作家在自己的線程中運行,並允許其他線程排隊寫入文件。儘管我認爲首先要考慮的是寫入文件是否真的是你想要做的。特別是在高流量的情況下,擁有大量磁盤I/O可能效率不高。

5

FileChannel理論上線程安全。來自javadoc:

文件通道可安全地由多個併發線程使用。通道 接口指定的任何時候都可以調用關閉方法。只有一個涉及頻道位置或 的操作可以在任何給定時間更改其文件大小; 嘗試啓動第二個這樣的操作,而第一個仍然是 正在進行將阻塞,直到第一個操作完成。其他 操作,特別是那些採取明確的立場,可能 並行進行;他們是否確實這樣做取決於底層實現,因此未指定。

如果你可以使用這些,那麼你可以使用內置的同步,而不必自己寫。

0

在這種情況下同步是必要的。 FileChannel對於防止JVM之外的進程修改文件很有用:對於包含多個線程寫入單個文件的應用程序來說,FileChannel非常有用。 (單位進一步下跌)的JavaDoc爲FileChannel:

文件持有鎖代表 整個Java虛擬機。它們是 不適合通過 同一虛擬機內的多個線程來控制對文件的訪問 。

請參閱this post瞭解在線程之間共享文件寫入策略的簡要討論。