- Java中NIO的文件锁定在很大程度上依赖操作系统的实现。并非所有的操作系统都支持共享锁(shared locks),在操作系统不支持共享锁的情况下,对于文件共享锁的请求将变成对于独占锁(exclusive locks)的请求。这保证了准确性,但是会降低性能。通道的isShared()方法可以判断锁是共享锁还是独占锁。
- 文件锁锁定的对象是文件而不是通道或者线程,如果我们的目的是要控制多个线程的并发访问,需要自己实现锁定方案(内存映射文件)。
- 带参数形式的lock()方法,锁会在文件内部区域获得,position指定开始锁定的位置,size指定锁定区域的大小,shared表示锁是否为共享锁(true为共享锁,false为独占锁)。锁定的范围可以超出文件尾,也可以是文件的任何一个区域,但不能为负数。锁定的区域会被受到保护。
- 如果在请求一个文件锁时,该文件已经被锁定,那么lock()方法会被阻塞,它必须等待前面的锁被释放,如果此时线程被阻塞,该线程将受到中断语义控制。我们可以调用channel的channel()方法获得Lock的创建通道。
- tyrLock()方法与lock()方法起相同的作用,它是lock()方法的非阻塞变体,如果请求的锁不能立即获得,它将返回null。
- 一个文件锁被创建以后,只有锁被释放、通道被关闭、或者jvm关闭时才会失效。isValid()方法可以检测一个锁的有效性。overlaps()方法可以查询一个你感兴趣的地方与你的锁是否有交集。
- 确保你的锁被释放,以避免可能发生的冲突和死锁。
FileLock lock = channel.lock();
try {
} catch (Exception e) {
// TODO
} finally {
lock.release();
}
- 示例代码
RandomAccessFile accessFile = new RandomAccessFile(new File("d:\\a.txt"), "rw");
FileChannel channel = accessFile.getChannel();
FileLock lock = channel.lock(0L, 50, false);
System.out.println(lock.isShared());
System.out.println(lock.isValid());
System.out.println(lock.overlaps(1, 100));
System.out.println(lock.overlaps(60, 100));
Thread.sleep(10000);
lock.release();
Thread.sleep(10000);
accessFile.close();
1.如果lock()的最后一个参数为true,当该代码执行时,其它** 进程 可以正常读,但是不能写,直到锁被释放。
2.如果lock()的最后一个参数为false,当该代码执行时,其它 进程 **既不能读,也不能写,直到锁被释放。
网友评论