2009-10-22 53 views
1

注意:我已经阅读了关于如何锁定和解锁文件的其他帖子。我没有发现任何我不知道的特别东西。所以我会把我的场景放在这里,以便有人可以提出一些建议。相应地锁定和更新文件

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

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

我有另一个想法是有一个平面文件,我会表明如果F应该更新。该平面文件的内容可以是LOCKED或UNLOCKED。默认/初始值将被解锁。所以,当其中一个程序想要更新F时,它需要在平面文件中看到该标志。如果标志读取LOCKED,它应该等待。在这种方法中,虽然有一个问题 - 如果多个程序同时打开平面文件,看到“UNLOCKED”或两个正在等待平面文件读取UNLOCKED的程序,并且同时看到文件读取“ UNLOCKED“?

任何想法的家伙?

+1

曾经看过Lucene的org.apache.lucene.store.Lock(例如SimpleFSLock和NativeFSLock)的实现吗?这些课程是为了完全相同的目的而制作的,所以也许你会从中得到一些想法。 – sfussenegger 2009-10-22 15:41:31

+0

听起来很酷..我要去看看。太感谢了。 – DragonBorn 2009-10-22 15:43:06

回答

3

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

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

+0

编辑:创建一个目录不是一个选项,因为其他程序应该能够读取文件的内容。锁定/解锁仅在更新期间发生。 – DragonBorn 2009-10-22 15:39:33

+0

为什么不是这个选项?其他程序不需要关心目录(不需要将文件放在该目录中)。 – sfussenegger 2009-10-22 15:43:08

+0

纠正我,如果我错了。所以我要创建一个目录并在需要更新文件时将其锁定,而不是锁定文件? – DragonBorn 2009-10-22 15:49:35