簡體   English   中英

以下Java代碼是否可以保證Windows中未打開文件的排他鎖?

[英]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通常不允許您刪除打開的文件。

從FileLock文檔中

文件鎖代表整個Java虛擬機。 它們不適合控制同一虛擬機中多個線程對文件的訪問。

文件鎖對象可以安全地被多個並發線程使用。

... 然后 ...

鎖定是否實際阻止其他程序訪問鎖定區域的內容取決於系統,因此未指定。 某些系統的本機文件鎖定功能僅僅是建議性的,這意味着程序必須協作地觀察已知的鎖定協議以保證數據的完整性。 在其他系統上,本機文件鎖是必需的,這意味着如果一個程序鎖定文件的某個區域,則實際上阻止其他程序以違反該鎖的方式訪問該區域。 在其他系統上,可以基於每個文件配置本機文件鎖是建議性的還是必需的。 為了確保跨平台的一致和正確行為,強烈建議使用此API提供的鎖,就像它們是建議鎖一樣。

即使對文件使用鎖定和解鎖標志,也僅保證在Java應用程序中具有排他鎖。

您必須使用JNI或另一種計算機語言來進行Windows調用,以保證Windows文件的獨占鎖定。

Windows LockFile功能

Windows UnlockFile功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM