【问题标题】:Mutual exclusion between two application两个应用程序之间的互斥
【发布时间】:2015-12-12 14:53:17
【问题描述】:

我想编写两个适用于单个文本文件的 Android 应用程序。

第一个应用程序(App1)的任务 -

A.检查 sdcard 根目录下是否存在文本文件“abc.txt”。

B.如果不存在,请在 sdcard 的根目录下创建“abc.txt”。

C.继续每隔 5 分钟定期将数据写入 abc.txt。

第二个应用程序(App2)的任务 -

A.检查 sdcard 根目录下是否存在文本文件“abc.txt”。

B.如果存在,则从文件“abc.txt”中读取所有数据并在阅读后将其删除

现在我可以通过每个应用程序单独读取和写入“abc.txt”,但我面临同步问题。我想确保如果第一个应用程序正在写入文本文件,第二个文件必须等到准备好读取文本文件。我会使用

synchronized

关键字如果它是一个应用程序。有人可以在这种情况下帮助我吗?

【问题讨论】:

  • 虽然回答的有点笼统,但我会给你一些想法:你显然需要一个外部同步机制。 锁定文件 - 例如“abc.txt.lock”怎么样?两个应用程序都应该在完成工作时创建这样的文件,然后将其删除。两个应用程序还应检查该文件是否存在。
  • @darthvading :请检查 Kathy Sierra 的 scjp 书中的“同步代码(目标 4.3)”..!!你会发现在哪里使用同步词..!!
  • @darthvading:检查这个:firozstar.tripod.com/_darksiderg.pdf .!!
  • 我认为你需要 java.nio.channels.FileLock - 请参阅 mfrankli 的答案 stackoverflow.com/questions/9746050/…
  • @Seelenvirtuose 我理解你的建议。我仍然觉得这里也有可能陷入僵局。假设 App1 和 App2 都看到“abc.txt.lock”不可用并且都尝试创建它的情况,反之亦然。我知道发生这种情况的可能性很小,但它可能会发生。

标签: java android deadlock synchronized


【解决方案1】:

FileLock 应该提供您需要的功能。您可以锁定abc.txt,也可以锁定一些其他文件,这些文件将始终存在并且仅用作您的应用程序的系统范围的锁定。

来自文档:

多个进程可以在文件的同一区域持有共享锁,但只有一个进程可以在文件的给定区域持有独占锁,并且没有其他进程可以同时持有与独占锁重叠的共享锁。

您可以从FileChannel获取整个文件的专属FileLock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多