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

| 因此,我使用以下命令在文件上创建了一个锁,以便可以对其进行独占编辑:
 File file = new File(filename);
 channel = new RandomAccessFile(file, \"rw\").getChannel();
 lock = channel.tryLock();
现在,我有第二个线程想要访问相同的文件-只是读取而不是编辑。我怎么做?现在,第二个线程将引发io异常,并通知我文件已锁定。 这可行吗?有什么建议么?谢谢     
已邀请:
您可以尝试使用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中的行为符合预期,但是不一定要确保它们在多个进程中的行为均符合预期。     
通常,锁定文件是基于操作系统的,并且当您执行写锁定时,该文件将被您所处的线程专有。但是您可以做的一件事是在线程之间共享文件对象(但要注意竞速条件)。     
也许有帮助!
public abstract FileLock tryLock(long position,
                                 long size,
                                 boolean shared)
                         throws IOException
  尝试在此通道文件的给定区域上获得锁定。      此方法不会阻止。调用总是立即返回,   要么已经锁定了   请求的区域或未能   这样做。如果无法获取锁   因为由   另一个程序然后返回null。   如果无法获得任何锁   其他原因然后适当   抛出异常。      由position和size参数指定的区域不需要   被包含在,甚至重叠,   实际的基础文件。锁   区域的大小是固定的;如果被锁定   区域最初包含的结尾   该文件,并且文件超出了   区域,然后是   文件不会被锁覆盖。   如果文件预期会增大   整个文件的锁是   所需的区域   零,且不小于预期   文件的最大大小,应为   锁定。零参数
tryLock()
  方法只是锁定一个大小的区域   
Long.MAX_VALUE
。      某些操作系统不支持共享锁,在这种情况下,   共享锁的请求是   自动转换为请求   排他锁。是否   新获得的锁被共享或   排他性可以通过调用进行测试   生成的锁对象的isShared   方法。      文件锁代表整个Java虚拟机保留。他们   不适合控制   通过多个线程访问文件   在同一虚拟机中。      参数:           position-锁定区域开始的位置;   必须为非负数           size-锁定区域的大小;必须为非负数,并且   总和头寸+大小必须为   非负的           shared-真,请求共享锁,假,请求共享锁   排他锁       返回值:           代表新获取的锁的锁对象;如果   无法获取锁,因为   另一个程序重叠   锁       抛出:           
IllegalArgumentException
-如果参数的前提条件   不举行           
ClosedChannelException
-如果此频道关闭           
OverlappingFileLockException
-如果锁与要求的重叠   该Java已经拥有该区域   虚拟机,或者另一个线程   已被此方法阻止,并且   试图锁定重叠   同一文件的区域           
IOException
-如果发生其他I / O错误       也可以看看:           
lock()
lock(long,long,boolean)
tryLock()
    

要回复问题请先登录注册