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

时间:2011-04-15 17:58:29

标签: java file-io filelock

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

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

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

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

3 个答案:

答案 0 :(得分:3)

您可以尝试使用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中按预期运行,但您不一定能确保它们在多个进程中按预期运行。

答案 1 :(得分:1)

正常情况下,锁定文件是基于操作系统的,当您执行写入锁定时,它将由您接受它的线程独占。但是,您可以做的一件事就是在线程之间共享文件对象(但要注意比赛条件)。File locking

答案 2 :(得分:1)

也许这有帮助!

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

尝试获取此频道文件的指定区域的锁定。

     

此方法不会阻止。调用总是立即返回,   要么获得锁定   要求的地区或没有   这样做。如果它无法获得锁定   因为重叠锁是由   另一个程序然后它返回null。   如果它没有获得任何锁定   其他原因则适当   抛出异常。

     

由position和size参数指定的区域不需要   被包含在内,甚至重叠   实际的底层文件。锁   区域大小固定;如果一个锁定   区域最初包含的结尾   文件和文件超出了   区域然后新的部分   锁不会覆盖文件。   如果文件预计会增大   并锁定整个文件   然后要求从一个区域开始   零,并且不小于预期   应该是文件的最大大小   锁定。零参数tryLock()   方法只是锁定一个大小的区域   Long.MAX_VALUE

     

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

     

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

     

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