【问题标题】:In Java, Is there a way to read a file when that file is locked by other thread?在Java中,当文件被其他线程锁定时,有没有办法读取文件?
【发布时间】:2011-04-15 17:58:29
【问题描述】:

所以我使用以下方法在文件上创建了一个锁,以便我可以独占编辑它:

 File file = new File(filename);
 channel = new RandomAccessFile(file, "rw").getChannel();
 lock = channel.tryLock();

现在我有第二个线程想要访问同一个文件 - 只是为了阅读,而不是编辑。我怎么做?现在第二个线程会抛出一个 io 异常并通知我文件被锁定。

这可行吗?有什么建议?谢谢

【问题讨论】:

    标签: java file-io filelock


    【解决方案1】:

    您可以尝试使用 tryLock 的三参数版本请求共享锁。

    这里是适当的 javadoc: http://download.oracle.com/javase/1.4.2/docs/api/java/nio/channels/FileChannel.html#tryLock%28long,%20long,%20boolean%29

    基本上不是做 lock=channel.tryLock() 你会做lock = channel.trylock(0, Long.MAX_VALUE, true)

    顺便说一句,您应该小心使用 java 中的文件锁定。虽然您可以保证锁在 JVM 中的行为符合预期,但您不一定能确定它们在多个进程中的行为是否符合预期。

    【讨论】:

      【解决方案2】:

      通常锁定文件是基于操作系统的,当你获得写锁时,它是由你获得它的线程独占的。但是,您可以做的一件事是在线程之间共享文件对象(但要小心赛车条件)。File locking

      【讨论】:

        【解决方案3】:

        也许这有帮助!

        public abstract FileLock tryLock(long position,
                                         long size,
                                         boolean shared)
                                 throws IOException
        

        尝试获取此通道文件的给定区域的锁定。

        此方法不会阻塞。调用总是立即返回, 要么已获得锁定 请求的区域或未能 这样做。如果获取锁失败 因为重叠锁被持有 另一个程序然后它返回null。 如果它未能获得任何锁 其他原因,然后是适当的 抛出异常。

        位置和大小参数指定的区域不需要 包含在其中,甚至重叠, 实际的基础文件。锁 区域大小固定;如果锁定 区域最初包含 文件和文件增长超出 区域然后是新的部分 文件不会被锁覆盖。 如果文件预计会增长 并且对整个文件的锁定是 然后需要一个区域,从 零,并且不小于预期 文件的最大大小,应该是 锁定。零参数tryLock() 方法只是锁定一个大小的区域 Long.MAX_VALUE.

        某些操作系统不支持共享锁,在这种情况下 共享锁的请求是 自动转换为请求 用于排他锁。是否 新获得的锁是共享的或 可以通过调用来测试独占 生成的锁对象的 isShared 方法。

        代表整个 Java 虚拟机持有文件锁。他们 不适合控制 多线程访问文件 在同一个虚拟机中。

        参数: position - 锁定区域开始的位置; 必须是非负数 size - 锁定区域的大小;必须是非负的,并且 总位置 + 大小必须是 非负 shared - true 请求共享锁,false 请求共享锁 排他锁 回报: 表示新获得的锁的锁对象,如果是 无法获取锁,因为 另一个程序持有重叠 锁 抛出: IllegalArgumentException - 如果参数的前提条件满足 不持有 ClosedChannelException - 如果此频道已关闭 OverlappingFileLockException - 如果锁与请求的重叠 区域已被此 Java 持有 虚拟机,或者如果另一个线程 已在此方法中被阻止并且 正在尝试锁定重叠 同一文件的区域 IOException - 如果发生其他一些 I/O 错误 也可以看看: lock()lock(long,long,boolean)tryLock()

        【讨论】:

          猜你喜欢
          • 2013-08-11
          • 1970-01-01
          • 2018-03-19
          • 2012-06-22
          • 2022-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多