【问题标题】:Can one JVM aquire two shared FileLocks?一个 JVM 可以获取两个共享文件锁吗?
【发布时间】: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


【解决方案1】:

来自 java 文档:

tryLock 抛出

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

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

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2011-06-01
    • 2011-01-10
    • 2011-08-27
    相关资源
    最近更新 更多