在Java中,当文件被其他线程锁定时,是否有方法读取该文件?

在Java中,当文件被其他线程锁定时,是否有方法读取该文件?,java,file-io,filelock,Java,File Io,Filelock,因此,我使用以下方法在文件上创建锁,以便以独占方式编辑它: File file = new File(filename); channel = new RandomAccessFile(file, "rw").getChannel(); lock = channel.tryLock(); 现在我有第二个线程想要访问同一个文件-只是读取,而不是编辑。我该怎么做?现在,第二个线程将抛出io异常,并通知我文件已锁定 这可行吗?有什么建议吗?谢谢通常情况下,锁定文件是基于操作系统的,当您获取写锁

因此,我使用以下方法在文件上创建锁,以便以独占方式编辑它:

 File file = new File(filename);
 channel = new RandomAccessFile(file, "rw").getChannel();
 lock = channel.tryLock();
现在我有第二个线程想要访问同一个文件-只是读取,而不是编辑。我该怎么做?现在,第二个线程将抛出io异常,并通知我文件已锁定


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

通常情况下,锁定文件是基于操作系统的,当您获取写锁定时,它是由获取它的线程独占的。但是,您可以做的一件事是在线程之间共享文件对象(但要注意赛车条件)。

也许这会有所帮助

public abstract FileLock tryLock(long position,
                                 long size,
                                 boolean shared)
                         throws IOException
尝试获取此频道文件给定区域的锁

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

位置和大小参数指定的区域不需要 被包含在,甚至重叠, 实际的底层文件。锁 区域的大小是固定的;如果一个锁 区域最初包含 文件和文件将超出 然后是区域的新部分 文件不会被锁覆盖。 如果预期文件的大小将增长 整个文件上的锁是 然后需要一个从 零,并且不小于预期值 文件的最大大小,应为 锁着的。零参数
tryLock()
方法只锁定大小的区域
Long.MAX\u值

某些操作系统不支持共享锁,在这种情况下 对共享锁的请求是无效的 自动转换为请求 用于独占锁。是否 新获取的锁是共享的还是共享的 可以通过调用 生成的锁对象是共享的 方法

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

参数: 位置-锁定区域开始的位置; 必须是非负的 大小-锁定区域的大小;必须是非负的,并且 合计位置+大小必须为 非负 shared(共享)-为true(请求共享锁),为false(请求共享锁) 独占锁 返回: 表示新获取的锁的锁对象,如果 无法获取锁,因为 另一个程序有一个重叠部分 锁 抛出:
IllegalArgumentException
-如果参数上的前提条件 不举行
ClosedChannel异常
-如果此频道已关闭
OverlappingFileLockException
-如果锁与请求的 该地区已被该Java控制 虚拟机,或者如果另一个线程 已在此方法中被阻止,并且 正在尝试锁定重叠的 同一文件的区域
IOException
-如果发生其他I/O错误 另见:
lock()
lock(long,long,boolean)
tryLock()


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

以下是相应的javadoc:

基本上不是做
lock=channel.tryLock()
您可以执行
lock=channel.trylock(0,Long.MAX\u值,true)

另一方面,您应该小心java中的文件锁定。虽然可以保证锁在JVM中的行为符合预期,但不一定能确保它们在多个进程中的行为符合预期