假设两个(或更多)并发运行的 Java 进程需要检查文件是否存在,如果不存在则创建它,然后在运行过程中可能从该文件中读取。我们希望保护自己免受多个写入器进程相互干扰和/或读取器进程读取文件的不完整或不一致版本的可能性。
我们目前正在做的仲裁这种情况是使用Java NIO FileLocks。一个进程设法在要创建的文件上获取排他锁FileChannel.tryLock()
并创建它,而其他并发运行的进程无法获取锁并回退到使用该文件的内存版本进行运行。
然而,锁定给我们的计算场带来了各种问题,因此我们正在探索替代方案。所以我的问题是:有没有办法在不使用文件锁的情况下安全地做到这一点?
例如,进程是否可以在发现文件不存在时写入独立的临时文件,然后在写入临时文件后或多或少“原子地”将临时文件移动到位?在这种情况下,我们可能最终会得到多个写入器进程,但如果从文件中读取的任何进程总是读取一个或另一个版本,而不是两个或多个版本的混合,那将是可以的。但是,我认为并非所有操作系统都保证如果您打开文件以供读取,即使在读取过程中被覆盖,您也会继续从文件的原始版本读取。
我们欢迎所有的建议!