Java 一个JVM可以获得两个共享文件锁吗?

Java 一个JVM可以获得两个共享文件锁吗?,java,multithreading,filelock,Java,Multithreading,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

如何获取两个共享文件锁?我有以下测试代码:

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,即使我在两个不同的线程中执行锁获取。或者共享锁只能用于两个不同的进程?还是我误解了共享,而共享仅仅是关于对文件“共享文件资源”的部分进行写和读访问?我真的找不到关于我的用例是否可行的文档

我希望基于文件的锁定具有与使用.readLock和.writeLock的新ReentrantReadWriteLock相同的行为,其中允许多个读锁,但只允许一个写锁。

来自java文档:

特里洛克投掷

OverlappingFileLockException—如果此Java虚拟机已持有与请求区域重叠的锁,或者如果此方法中已阻止另一个线程并试图锁定重叠区域


编辑:我假设您的案例满足的条件是重叠区域,因为您只创建了文件,并且它不包含任何内容

您在哪个平台上运行?有些平台不支持共享锁,在这种情况下,对共享锁的请求会自动转换为对独占锁的请求。Ubuntu,但我不能相信它不支持itIndeed,如果assertTruelock1.isShared通过,那么这可能不是问题。是的,我担心我误解了“共享”的含义,因为锁定不同的区域会通过。我可能也会误解,因为听起来您的用例应该可以工作:文件锁定要么是独占的,要么是共享的。共享锁防止其他并发运行的程序获取重叠的独占锁,但允许它们获取重叠的共享锁。独占锁防止其他程序获取任何类型的重叠锁。也许这是一个问题,因为您正试图从同一进程中锁定。