当前位置: 首页 > 面试题库 >

Java文件锁定

通学真
2023-03-14
问题内容

我有几个线程(其中一些由进程X产生,其他由进程Y 等产生 ),并且每个线程都需要写入文件MyFile。但是,如果Thread T1开始写MyFile第一,那么,当Thread T2开始写作,它需要等待T1释放文件 ,以便它可以读取写在该内容Thread T1。换句话说,每个线程都会有一个finalizeThread方法,如下所示:

private void finalizeThread() {
    File f = new File("MyFile.dat");
    f.createNewFile();  // atomically creates the file, if it doesn't exist
    locked_section {
        readContentsFromFile(f); // read contents if some other thread already modified the file
        modifyContentsFromFile(f); // modify
        writeFile(f); // write, so that new threads can see the content modified by this thread
    }
}

我的问题是:如何完成locked_section以上代码?我正在研究FileLock该类,但是它在Javadoc中说:
“文件锁代表整个Java虚拟机持有。它们不适合控制同一虚拟机中多个线程对文件的访问。”


问题答案:

如果仅从程序访问文件,则同步锁定对象是可以的。但是,如果您想在处理文件时避免文件被其他程序更改,则可以在java.nio.channels.FileLock(示例)中使用Java的文件锁定功能。如文本所述,请注意,在某些操作系统上,如果程序不检查现有文件锁,它们仍然可以更改文件。



 类似资料:
  • 问题内容: 我们的一位客户正在使用某些Novell安全软件,有时会锁定我们的软件创建的某些.class文件。发生这种情况时,这会给他们带来一些麻烦的问题,我正在尝试研究一种变通办法,我们可以将其添加到错误处理中以解决此问题。我想知道java api中是否有任何调用可用于检测文件是否已锁定,如果已锁定,则将其解锁。 问题答案: 在尝试写入文件之前,您可以使用File.canWrite()检查Java

  • 进程锁 这里的进程锁与线程锁、互斥量、读写锁和自旋锁不同,它是通过记录一个PID文件,避免两个进程同时运行的文件锁。 进程锁的作用之一就是可以协调进程的运行,例如crontab使用进程锁解决冲突提到,使用crontab限定每一分钟执行一个任务,但这个进程运行时间可能超过一分钟,如果不用进程锁解决冲突的话两个进程一起执行就会有问题。后面提到的项目实例Run也有类似的问题,通过进程锁可以解决进程间同步

  • 问题内容: 这可能与以前的帖子类似,但是我想具体说明在网络上而不是本地使用锁定。我想将文件写入共享位置,因此它很可能会在网络上运行(一定是Windows网络,也许是Mac)。我想防止其他人在写入文件时读取文件的任何部分。这不是一个高度并发的过程,文件通常小于10MB。 我已经阅读了文档和文档,对什么是安全的和什么不是安全的感到有些困惑。我想锁定整个文件,而不是部分文件。 我可以使用,并且它在网络上

  • 问题内容: 尽管在finally子句中关闭了流,但是使用Java时,我似乎经常遇到清理问题的情况。File.delete()无法删除文件,Windows Explorer也失败。运行System.gc()有时会有所帮助,但是始终终止VM总是无济于事,这不是一个选择。 有人有其他可以尝试的想法吗?我在Windows XP上使用Java 1.6。 更新:删除了FLAC代码示例,如果我将其隔离的话,该代

  • 问题内容: 我在使用Java在Windows中删除文件时遇到一些问题。由于某种原因,java会锁定我的文件,但我不知道为什么。这是我的代码: file.delete()以及在资源管理器中手动尝试拒绝删除该文件,因为它仍在使用中。尽管在Linux中一切似乎都很好。 我在某处缺少close()吗?我可以确认首先使文件成为关闭文件的方法,因为我可以在使用file.delete()运行上述代码之前删除文件

  • 问题内容: UNIX文件锁定非常简单:操作系统假定您知道自己在做什么,然后就可以按照自己的意愿进行操作: 例如,如果您尝试删除另一个进程已打开的文件,则操作系统通常会允许您执行此操作。原始进程仍将保留其文件句柄,直到它终止-这时文件系统将安静地回收磁盘资源。不用大惊小怪,这就是我喜欢的方式。 Windows上的不同之处:如果我尝试删除另一个进程正在使用的文件,则会出现操作系统错误。在原始进程释放它