在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中的行为符合预期,但不一定能确保它们在多个进程中的行为符合预期