注意:我已阅读有关如何锁定和解锁文件的其他帖子。我没有发现任何我不知道的特别的东西。因此,我将把我的情景放在这里,以便有人可以提出一些建议。

根据我的经验,当来自多个jvm实例的不同对象试图锁定和更新文件时,FileChannel.lock不保证锁定和解锁文件的情况。

我的应用程序中的场景是 - 有三个单独的程序来更新文件。这些程序在不同的jvm实例上运行。假设程序是A,B和C,文件是F.如果A锁定文件F,B和C应该等待F释放,然后其中一个程序可以保持它。如果程序在同一个jvm实例上运行,这可以正常工作。不幸的是,这在多个jvm实例中不起作用。

我有另一个想法是有一个平面文件,我指出是否应该更新F.该平面文件的内容可以是LOCKED或UNLOCKED。默认/初始值将为UNLOCKED。因此,当其中一个程序想要更新F时,它需要在平面文件中看到该标志。如果flag读取LOCKED,它应该等待。在这种方法中,存在一个问题 - 如果多个程序同时打开平面文件并且看到“UNLOCKED”,那该怎么办呢?或两个程序正在等待平面文件读取UNLOCKED并且同时看到文件读取“UNLOCKED”?

任何想法的人?

有帮助吗?

解决方案

如果需要锁定文件系统,则必须创建目录。目录存在意味着“已锁定”,缺少目录意味着已解锁。

原因是创建和删除目录必须是任何文件系统中的原子操作。因此,只要两个进程尝试创建相同的目录,其中一个就会出错。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top