【问题标题】:Locking file across services跨服务锁定文件
【发布时间】:2011-03-13 10:45:51
【问题描述】:

在同一应用程序中的两个“编写器”服务之间共享文件的最佳方式是什么?

编辑: 抱歉,我想我应该提供更多详细信息。

我有一个将条目保存到缓冲区的服务。当缓冲区已满时,它将所有条目写入文件(依此类推)。另一个正在运行的服务会在某个时候读取文件(本质上是复制/压缩它)然后清空它。

【问题讨论】:

  • 我已经更新了我的答案...如果它符合您的要求,请告诉我。

标签: java android multithreading concurrency


【解决方案1】:

以下是您可以做什么的总体思路:

public class FileManager
{
    private final FileWriter writer = new FileWriter("SomeFile.txt");
    private final object sync = new object();

    public void writeBuffer(string buffer)
    {
        synchronized(sync)
        {
            writer.write(buffer.getBytes());
        }
    }        

    public void copyAndCompress()
    {
        synchronized(sync)
        {
            // copy and/or compress
        }
    }

}

您将需要做一些额外的工作才能让这一切安全运行,但这只是一个基本示例,让您了解它的外观。

【讨论】:

  • 谢谢,但我认为这不是我想要的。我将更新第一篇文章以提供更多详细信息。对不起:)
  • @roul,好的,我已根据您的说明更新了答案。
  • 老实说,我想避免这样的事情 :) 但我现在想不出其他任何事情。就我而言,因为我有 android 服务,所以对象锁和方法应该是静态的,并且服务会调用 FileManager。
  • roul,目标是避免使用synchronized 关键字吗?如果你愿意,你可以回到我的消费者/生产者示例,而不是处理字符串,你可以处理命令/操作。命令被添加到阻塞队列中,消费者获取命令并在文件上执行它们:在这种情况下,synchronized 关键字不会锁定。
  • 我想我只是想避免在某处“集中”锁定 - 要么是两个服务之一,要么是一个新的 FileManager 类。但我想这是最好的方法。感谢您的帮助!
【解决方案2】:

一种常用的锁定方法是在与主文件相同的位置创建第二个文件。第二个文件可能包含锁定数据或为空白。拥有锁定数据(例如进程 ID)的好处是您可以轻松检测过时的锁定文件,这是您必须计划的必然性。尽管 PID 在您的情况下可能不是最好的锁定数据。

示例: 服务1:

  • 创建myfile.lock
  • 创建/打开myfile

服务2:

  • 注意到myfile.lock 存在并暂停/阻止/等待
  • myfile.lock 消失时,它会创建它,然后打开 myfile。

在创建文件后立即仔细检查文件是否包含您的锁定信息(特定于您的服务的标识)对您也是有利的 - 以防两个或更多服务正在等待并创建完全相同的锁定时间。最后一个成功,因此所有其他服务应该注意到它们的锁定数据不再在文件中。另外 - 在检查其内容之前暂停几毫秒。

【讨论】:

  • 有趣的解决方案,但我不知道如何在我的情况下使用它。还是谢谢。
  • 我明白了。我的解决方案适用于多个应用程序,但我看到您正在同步应用程序中的进程。我很困惑,因为您称它们为“服务”。我同意接受的答案 - synchronized 关键字适合您的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多