问题描述
|
因此,我使用以下命令在文件上创建了一个锁,以便可以对其进行独占编辑:
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()