【问题标题】:Locking and Updating a File Accordingly相应地锁定和更新文件
【发布时间】:2009-10-22 15:32:22
【问题描述】:

注意:我已阅读其他有关如何锁定和解锁文件的帖子。我没有发现任何我不知道的特别之处。所以我会把我的场景放在这里,以便更好地理解手头的问题。

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

我的应用程序中的场景是 - 有三个单独的程序更新文件。这些程序正在不同的 jvm 实例上运行。假设程序是 A、B 和 C;并且文件是 F。如果 A 锁定了文件 F,B 和 C 应该等待 F 被释放,然后其他程序之一才能获得它。如果程序在同一个 jvm 实例上运行,这将很好。不幸的是,这在多个 jvm 实例中不起作用。

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

有什么想法吗?

【问题讨论】:

  • 看过 Lucene 的 org.apache.lucene.store.Lock 实现(例如 SimpleFSLock 和 NativeFSLock)?这些课程的目的完全相同,所以也许你会从中得到一些想法。
  • 听起来很酷……我要去看看。谢谢一百万。

标签: java file locking file-locking unlock


【解决方案1】:

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

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

【讨论】:

  • 为什么没有这个选项?其他程序不需要关心目录(你不需要把文件放在那个目录中)。
  • 您不能锁定目录。目录的锁。当目录存在时,F 被锁定。每个程序都必须创建目录(并等到它消失),然后读取/修改 F 然后再次删除目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多