2009-10-22 62 views
1

注意:我已經閱讀了關於如何鎖定和解鎖文件的其他帖子。我沒有發現任何我不知道的特別東西。所以我會把我的場景放在這裏,以便有人可以提出一些建議。相應地鎖定和更新文件

根據我的經驗,FileChannel.lock並不能保證當多個jvm實例的不同對象試圖鎖定和更新文件時,鎖定和解鎖文件的情況。

我的應用程序中的場景是 - 有三個更新文件的單獨程序。這些程序在不同的jvm實例上運行。假設程序是A,B和C,文件是F.如果A鎖定了文件F,那麼B和C應該等待F被釋放,然後其他程序才能保留它。如果程序在同一個jvm實例上運行,這可以正常工作。不幸的是,這在多個jvm實例中不起作用。

我有另一個想法是有一個平面文件,我會表明如果F應該更新。該平面文件的內容可以是LOCKED或UNLOCKED。默認/初始值將被解鎖。所以,當其中一個程序想要更新F時,它需要在平面文件中看到該標誌。如果標誌讀取LOCKED,它應該等待。在這種方法中,雖然有一個問題 - 如果多個程序同時打開平面文件,看到「UNLOCKED」或兩個正在等待平面文件讀取UNLOCKED的程序,並且同時看到文件讀取「 UNLOCKED「?

任何想法的傢伙?

+1

曾經看過Lucene的org.apache.lucene.store.Lock(例如SimpleFSLock和NativeFSLock)的實現嗎?這些課程是爲了完全相同的目的而製作的,所以也許你會從中得到一些想法。 – sfussenegger 2009-10-22 15:41:31

+0

聽起來很酷..我要去看看。太感謝了。 – DragonBorn 2009-10-22 15:43:06

回答

3

如果您需要鎖定文件系統,那麼您必須創建一個目錄。目錄存在意味着「鎖定」,缺少目錄意味着解鎖。

原因是創建和刪除目錄必須是任何文件系統中的原子操作。因此,只要兩個進程嘗試創建相同的目錄,其中一個會收到錯誤。

+0

編輯:創建一個目錄不是一個選項,因爲其他程序應該能夠讀取文件的內容。鎖定/解鎖僅在更新期間發生。 – DragonBorn 2009-10-22 15:39:33

+0

爲什麼不是這個選項?其他程序不需要關心目錄(不需要將文件放在該目錄中)。 – sfussenegger 2009-10-22 15:43:08

+0

糾正我,如果我錯了。所以我要創建一個目錄並在需要更新文件時將其鎖定,而不是鎖定文件? – DragonBorn 2009-10-22 15:49:35