以下java代码是否保证在Windows中未打开的文件上进行独占锁定?

时间:2010-07-08 11:33:09

标签: java windows concurrency filelock

以下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();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

可以在Java规范中看到:

  

代表整个Java虚拟机保存文件锁。它们不适合控制同一虚拟机中多个线程对文件的访问。

因此,如果您需要为该主题提供独占锁定,请选择其他方式。

答案 1 :(得分:1)

tl; dr:否。您不能对主机操作系统处理锁的行为做出假设。

好消息:您是否在尝试确保应用程序中具有线程安全锁定机制?如果是这样,FileLock就足够了(假设应用程序的其余部分由正确编写的线程安全代码组成)。

坏消息:不幸的是,如果您要确保Windows能够兑现对所有应用程序的锁定,那么您就不能指望它。

在Windows中很容易观察到:您经常可以覆盖正在写入的文件(例如,当日志文件太长时,我会删除所有以前的垃圾邮件)。也就是说,Windows通常不允许您删除打开的文件。

From the FileLock documentation

  

代表文件锁   整个Java虚拟机。他们是   不适合控制访问   一个文件由多个线程内的   相同的虚拟机。

     

文件锁定对象可以安全使用   多个并发线程。

......以后......

  

是否实际锁定   防止其他程序   访问锁定的内容   区域是系统依赖的   因此未指明。本土的   一些文件锁定设施   系统只是建议,意思   程序必须合作   观察已知的锁定协议   为了保证数据的完整性。上   其他系统本机文件锁是   强制性,意味着如果一个程序   锁定文件的区域,然后锁定其他区域   实际上阻​​止了程序   以某种方式访问​​该区域   会违反锁定。还有一点   系统,无论是本机文件锁   咨询或强制性是可配置的   在每个文件的基础上。确保   一致和正确的行为   平台,强烈推荐   这个API提供的锁是   就像他们是咨询锁一样。

答案 2 :(得分:0)

即使您对文件使用锁定和解锁标志,您也只能保证在Java应用程序中具有独占锁

您必须使用JNI或其他计算机语言进行Windows调用以保证对Windows文件的独占锁定。

Windows LockFile功能

Windows UnlockFile功能