所以我使用以下命令在文件上创建一个锁,以便我可以独占编辑它:
File file = new File(filename);
channel = new RandomAccessFile(file, "rw").getChannel();
lock = channel.tryLock();
现在我有第二个线程想要访问同一个文件 - 只是为了阅读,而不是编辑。我怎么做?现在,第二个线程将抛出一个io异常并通知我文件被锁定。
这可行吗?有什么建议?感谢
答案 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()