Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
下面的java代码是否保证并独占锁定Windows中未打开的文件?_Java_Windows_Concurrency_Filelock - Fatal编程技术网

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

下面的java代码是否保证并独占锁定Windows中未打开的文件?,java,windows,concurrency,filelock,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(

以下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虚拟机持有。它们不适合控制同一虚拟机内多个线程对文件的访问


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

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

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

窗口功能


Windows功能

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

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

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

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

:

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

文件锁定对象对于用户来说是安全的 多个并发线程

。。。后来

是否真的有锁 防止另一个程序 访问已锁定文件的内容 区域依赖于系统,并且 因此未指明。本地人 某些应用程序的文件锁定功能 系统仅仅是咨询性的,也就是说 这些项目必须相互合作 请遵守中的已知锁定协议 以保证数据的完整性。在…上 其他系统的本机文件锁是 强制性,意味着如果一个程序 锁定文件的一个区域,然后锁定其他区域 程序实际上是被阻止的 以一种 会破坏锁。另一方面 系统,无论是否使用本机文件锁 可配置为“咨询”或“强制” 以每个文件为基础。确保 跨部门的一致和正确行为 平台,强烈推荐 此API提供的锁 就像是顾问锁一样使用


文件锁定的文档中有很多关于文件锁定的警告。听起来你不能依赖它。你的代码与“未打开的文件”无关。它打开mylog.log,然后锁定它。不清楚您在问什么。
FileLock
对于线程间锁是不够的。请参阅Javadoc。@EJP,是的,我引用了您正在引用的Javadoc部分。我还指出,如果线程间问题是您要解决的,那么您需要额外的线程安全性。如果你回到原来的问题,虽然,只有一个线程。目前还不清楚他们是在试图解决单线程Java程序与操作系统其他部分的冲突,还是多线程程序与自身的冲突。