【问题标题】:Writing simultaneously to a single file with multiple threads in JAVA, synchronized by rows在 JAVA 中使用多个线程同时写入单个文件,按行同步
【发布时间】:2015-04-02 15:18:20
【问题描述】:

我有一个模拟 10X3 数组的文件。第一列是一个序列号,女巫是唯一的,所以我可以区分每一行。我在问是否可以同步 2 个线程以在同一个文件中写入,根据它们所在的行锁定它们(如果线程 2 在同一行中写入线程 1 想要写入,则线程 1 无法访问文件,它们可以同时写入其他行)。我有一个包含 10 个 ReentrantLock() 项的 Lock 数组,每个 Lock 项将锁定相应的 id 行(他们在搜索文件中的 ID 之前获得锁)。简单的方法是将文件加载到数组中。但我想知道我是否可以在文件中实现这一点。我不深入了解文件在java中是如何工作的,但我主要担心的是,当它们同时写入文件时,最后结束的线程将给出文件的最终值,所以到目前为止所做的任何更改其他线程将被删除,因为需要保存文件。

【问题讨论】:

  • 为什么需要并发写入文件?按顺序执行更改不是更简单吗?
  • 我不相信 Java 的 OutputStream 支持这样的文件中途写入。可能还有另一种方法可以做到这一点,但在我 10 年的 Java 行业经验中,它从来没有必要或实用。要考虑的另一件事是磁盘总是比 CPU 慢,因此多线程写入不会为您带来任何加速。我认为获得加速的唯一方法是将多个文件写入多个独立磁盘。
  • This 是 C++ 的一个类似问题,但也许答案会给您一些一般性的见解。
  • 其实这个文件比那个大很多,而且对文件的改动也很大。我只是举了那个例子,因为它更简单。问题还是一样的。另外我想测试一些策略之间的效率。

标签: java multithreading file synchronization locking


【解决方案1】:

由于您提到的原因,我认为只有一个文件是不可能的。

如果您真的想对纯文本文件执行此操作,您可以为每一行创建一个文件。另一种选择是使用Document。完成所有工作后,应该很容易将文档解析为纯文本文件。

在我看来,最简单的解决方案是使用数据库,特别是如果数组以后有可能增长。

【讨论】:

  • 我想我会选择阵列。当然,数据库是最好的主意,但我想要一个项目。我在想这两种方法(因为我们有文件而不是数据库)。也许当我完成它时,我会测试另一种方法并发布一些结果:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2011-06-13
  • 2020-10-03
相关资源
最近更新 更多