2011-06-16 14 views
3

在Java 1.5中,java.nio.channels.FileLock沒有檢查查看已經被鎖定的文件。 Referenced HereJava 5和Java 6之間的FileLock變化

的片段狀態:

的java.nio.channels.FileLock中的類檢查已經通過 其他FileChannel實例

鎖定的文件

Java SE 6中拋出 OverlappingFileLockException如果 應用程序嘗試鎖定區域 ,該區域與通過 另一個FileChannel實例鎖定的區域重疊。以前的 版本未檢查由其他FileChannel 實例獲取的文件鎖 。默認情況下,java.nio.channels.FileChannel.lock 方法檢查請求的鎖 是否與此虛擬機所持有的區域重疊。

因此,在Java 6之前,如果有多個程序寫入同一個文件(每個程序試圖獲得排他鎖),排他性文件鎖定不起作用。人們如何在Java 5之前和之前解決這個問題?

回答

1

我不認爲Java5的行爲是一個嚴重的問題。

考慮將文件鎖定與進程相關聯的操作系統。如果一個進程已經擁有一個文件鎖,當它再次請求鎖時,操作系統可以無誤地授予它。從某種意義上說,這是一個「折返」鎖。它可以防止兩個進程同時鎖定同一個文件,並且由進程確定當它有鎖時,它不會有兩個線程對文件進行重疊更改。

在JVM中通常有很多獨立的包,必須有兩個包試圖鎖定同一個文件的用例。如果他們都被授予了鎖定權限,那麼我們遇到了問題。很難要求這兩個獨立的軟件包以某種方式進行合作,因此Java6將所有權從整個過程縮減爲一個渠道。 (希望這兩個軟件包不會共享相同的頻道)

然而,這樣的用例可能不是很常見。通常文件是一些特殊類型的文件,只能通過某個包來處理。想象一下數據庫包,它的文件不可能被相同JVM中的其他包所接觸,但可能會被其他JVM中的相同包所觸及。所以在這種情況下,Java5的行爲將會很好,這種情況可能是大多數。