【发布时间】:2014-06-23 13:58:44
【问题描述】:
如何获得两个共享的 FileLock?我有以下测试代码:
File file = new File(lockDir, "tmp.lock");
file.createNewFile();
FileChannel channel = new RandomAccessFile(file, "r").getChannel();
boolean shared = true;
FileLock lock1 = channel.tryLock(0, Long.MAX_VALUE, shared);
assertTrue(lock1.isValid());
assertTrue(lock1.isShared());
// I get an OverlappingFileLockException here:
FileLock lock2 = channel.tryLock(0, Long.MAX_VALUE, shared);
assertTrue(lock2.isValid());
assertTrue(lock2.isShared());
lock1.release();
lock2.release();
但是我在标记的行中得到了一个 OverlappingFileLockException,即使我在两个不同的线程中执行锁定获取。或者共享锁只能用于两个不同的进程?还是我误解了共享,它只是关于对文件的某些部分具有读写访问权限(“共享文件资源”)?我真的找不到关于我的用例是否可行的文档。
我希望基于文件的锁定具有与 new ReentrantReadWriteLock() 和 .readLock() 和 .writeLock() 相同的行为,其中允许多个读锁但只有一个写锁。
【问题讨论】:
-
您在哪个平台上运行?来自the JavaDocs:“有些平台不支持共享锁,这种情况下共享锁请求会自动转换为排他锁请求。”
-
Ubuntu,但我不敢相信它不支持它
-
确实,如果
assertTrue(lock1.isShared())通过了,那可能就不是问题了。 -
是的,我担心我误解了“共享”的含义,因为锁定不同的区域会通过。
-
我也可能会产生误解,因为听起来您的用例确实应该有效:“文件锁是独占的或共享的。共享锁可防止其他并发运行的程序获取一个重叠的独占锁,但确实允许它们获取重叠的共享锁。独占锁可防止其他程序获取任一类型的重叠锁。” 也许这是一个问题,因为您试图从同一个锁中锁定过程。
标签: java multithreading filelock