代码之家  ›  专栏  ›  技术社区  ›  hawkeye

下面的java代码是否保证并独占锁定Windows中未打开的文件?

  •  0
  • hawkeye  · 技术社区  · 14 年前

    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 回复  |  直到 9 年前
        1
  •  1
  •   Vadim Fedorov    14 年前

    如Java规范所示:

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

    因此,如果您需要线程的独占锁,请选择其他方式。

        2
  •  1
  •   Bob Cross n8wrl    14 年前

    热释光;博士: 不可以。不能对主机操作系统处理锁的行为进行假设。

    好消息: FileLock 就足够了(当然,假设应用程序的其余部分由正确编写的线程安全代码组成)。

    坏消息: 不幸的是,如果您试图确保Windows在所有应用程序上都使用您的锁,那么您就不能指望它了。

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

    From the FileLock documentation :

    文件锁代表 不适合控制访问 相同的虚拟机。

    文件锁定对象对于 多个并发线程。

    是否真的有锁 访问已锁定文件的内容 区域依赖于系统并且 文件锁定设施的一些 系统仅仅是咨询性的,意味着 项目必须合作 以保证数据的完整性。在 其他系统本机文件锁是 强制性的,意思是如果一个程序 先锁定文件的一个区域,然后锁定另一个区域 程序实际上是被阻止的 以一种 会破坏锁。另一方面 建议性或强制性是可配置的 在每个文件的基础上。确保 一致和正确的行为 平台,强烈建议 此API提供的锁

        3
  •  0
  •   Gilbert Le Blanc    14 年前

    即使对文件使用锁定和解锁标志,也只能保证拥有独占锁定 .

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

    窗户 LockFile

    窗户 UnlockFile 功能