首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java FileLock无异常阻塞;等待锁

Java FileLock无异常阻塞;等待锁
EN

Stack Overflow用户
提问于 2013-04-12 18:08:00
回答 2查看 4.3K关注 0票数 10

我发现Java文件锁定机制是一个真正的错误,因为它不能执行锁锁的第一条规则--阻止调用锁定!除非我错了--如果应用程序已经在文件上维护了一个锁,那么调用lock()就会引发异常,我知道这就是我的应用程序中的情况。我在这里查看了一些答案,不幸的是,我没有使用Java 7。

是否有人建议我如何处理等待独占文件锁而不将自己放入while(true)循环:)

在Aubin回答后进行编辑(从注释中复制):

我想要做的是在一个大文件被复制到一个目录后访问它,然后处理它。我的代码很简单。

代码语言:javascript
复制
public boolean ifFileReady(File file) {
   boolean ready = false;
   FileLock lock = null;
   FileChannel channel = null;
   try {

      channel = new RandomAccessFile(file, "rw").getChannel();
      lock = channel.lock();
      lock.release();
      ready = true;
   }
   catch( IOException e ) {
      // Always Here
   }
   finally
   {
      if (channel != null)
         channel.close();
   }
   return ready;
}

我从不挡在锁上。它总是抛出

EN

回答 2

Stack Overflow用户

发布于 2015-03-11 16:54:49

下面的代码演示了在不引发异常的情况下锁确实会阻塞。我也遇到了类似的问题,但发现这个异常实际上是在我的用户没有权限的情况下打开文件rw造成的。

这是一个完整的程序;为演示同时运行两个实例

代码语言:javascript
复制
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

public class Test {
  public static void main(String args[]) throws Exception {
    FileChannel channel = null;
    File lockFile = new File("lock");
    System.out.println ("Opening file...");
    channel = new RandomAccessFile(lockFile, "rw").getChannel();
    System.out.println ("File open. Locking channel...");
    channel.lock();
    System.out.println ("Channel locked. Sleep for 30 seconds");
    Thread.sleep (30000);
    System.out.println ("Process terminating");
    }
}

为了更好地考虑代码,我没有包括解锁、关闭或异常处理(您将得到编译器的警告)。当进程退出时,操作系统应该自动释放所有资源。

票数 3
EN

Stack Overflow用户

发布于 2013-04-12 18:43:49

文档 of java.nio.channels.FileChannel的副本

公共抽象FileLock锁(长位置、长大小、布尔共享)抛出IOException 获取该通道文件的给定区域的锁。 对此方法的调用将被阻塞,直到该区域被锁定()、此通道被关闭或调用线程被中断(以第一位为准)。 自: 1.4

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15978064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档