【问题标题】:How to lock files in Java RMI?如何在 Java RMI 中锁定文件?
【发布时间】:2021-06-13 01:55:23
【问题描述】:

我正在使用 Java RMI 实现一个快速文件服务器,它有两种远程方法,一种用于从服务器读取文件,另一种用于将其写入客户端。

我想锁定对同一文件的并发访问。例如,如果 10 个用户同时调用 read() 和 write() 远程方法,指定同一个文件:'foo.txt',我需要在第二个调用之前完全执行第一个调用,第二个调用是在第三次调用之前完全执行...

如果我在两个 RMI 方法中使用“同步”语句,如果不同的用户同时调用这些方法,指定不同的文件,我会失去效率。

另一方面,我不能使用 FileLock 类,因为:

"代表整个 Java 虚拟机持有文件锁。 它们不适合控制多人对文件的访问 同一虚拟机中的线程。”

在 RMI 中,同一个 JVM 中只有一个进程,它为每个远程调用执行新线程。

【问题讨论】:

  • 我建议每个文件一个远程对象实例,以及方法同步。但是文件读写在操作系统级别是原子的。

标签: java multithreading concurrency rmi locks


【解决方案1】:

您可以使用ReadWriteLock 来处理每个文件的Path 的读/写锁定 - 但前提是您不运行 RMI 服务器的多个进程或期望这些文件在一个 RMI 之外更改服务器虚拟机。每个读取或写入的入口点都需要为提供的路径找到ReentrantReadWriteLock,例如在此处使用getReadWriteLock(Path)

private static ConcurrentHashMap<Path,ReentrantReadWriteLock> LOCKS = new ConcurrentHashMap<>();
private static ReentrantReadWriteLock getReadWriteLock(Path path) {
    return LOCKS.computeIfAbsent(path, p -> new ReentrantReadWriteLock());
}

然后您自己的代码可以使用readLock()writeLock() API 调用来在没有写入发生时允许多个读取器。随着时间的推移,您需要做一些清理工作以清除不再使用的条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多