[英]Does the following java code guarantee and exclusive lock on an unopened file in Windows?
以下Java代碼是否可以保證Windows中未打開文件的排他鎖?
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
File file = new File("mylog.log");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.getChannel().lock();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如Java規范所示:
文件鎖代表整個Java虛擬機。 它們不適合控制同一虛擬機中多個線程對文件的訪問。
因此,如果您需要線程的排他鎖,請選擇另一種方式。
tl; dr:否。您無法假設主機操作系統對鎖的處理方式。
好消息:您是否正在嘗試確保應用程序中具有線程安全的鎖定機制? 如果是這樣, FileLock
就足夠了(當然,假設應用程序的其余部分由正確編寫的線程安全代碼組成)。
壞消息:不幸的是,如果您試圖確保Windows兌現對所有應用程序的鎖定,則不能指望這一點。
在Windows中,這很容易觀察到:您通常可以覆蓋正在寫入的文件(例如,當日志文件太長時,我會用emacs砍掉所有以前的垃圾郵件)。 也就是說,Windows通常不允許您刪除打開的文件。
文件鎖代表整個Java虛擬機。 它們不適合控制同一虛擬機中多個線程對文件的訪問。
文件鎖對象可以安全地被多個並發線程使用。
... 然后 ...
鎖定是否實際阻止其他程序訪問鎖定區域的內容取決於系統,因此未指定。 某些系統的本機文件鎖定功能僅僅是建議性的,這意味着程序必須協作地觀察已知的鎖定協議以保證數據的完整性。 在其他系統上,本機文件鎖是必需的,這意味着如果一個程序鎖定文件的某個區域,則實際上阻止其他程序以違反該鎖的方式訪問該區域。 在其他系統上,可以基於每個文件配置本機文件鎖是建議性的還是必需的。 為了確保跨平台的一致和正確行為,強烈建議使用此API提供的鎖,就像它們是建議鎖一樣。
即使對文件使用鎖定和解鎖標志,也僅保證在Java應用程序中具有排他鎖。
您必須使用JNI或另一種計算機語言來進行Windows調用,以保證Windows文件的獨占鎖定。
Windows LockFile功能
Windows UnlockFile功能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.