Java - 以原子方式处理文件

标签 java concurrency io

我正在编写一个Java应用程序,它应该(除其他外)生成一个整数序列,从给定的数字开始(例如900、901、902、903,... - 900作为参数给出) .

  1. 当应用程序关闭然后再次启动时,当前序列值应保持不变。
  2. 当应用程序的多个实例同时运行时,它们应共享相同的序列(例如,所有实例生成的序列的并集应与单独运行时单个实例生成的序列相同) .
  3. 管理员应该能够关闭应用程序并手动重置当前序列值。
  4. 如果应用程序崩溃,该文件应始终可供其他实例访问,以便它们可以继续工作。

我们决定应用程序将使用仅包含当前号码的纯文本文件。当应用程序启动时,它会检查文件是否已存在,如果不存在,则创建该文件并将初始编号写入其中。每次应用程序要生成一个新数字时,它都应该读取文件中的当前值,将其用作当前序列值,然后递增文件中的数字。

我现在想知道如何以原子方式完成这两件事(相对于同一应用程序的其他正在运行的实例):

  • 检查文件是否存在,如果不存在,则创建它并向其中写入一个数字
  • 读取文件的当前内容,然后更改它

关于如何以其他方式实现列出的目标的建议也受到赞赏。

最佳答案

使用数据库序列将是一个简单而可靠的解决方案,但您已决定它将是一个文件。然后您需要自己管理分布式同步。有些系统提供了这种功能,例如 Terracotta 或 Hazelcast。我肯定会使用其中之一,而不是基于锁定文件来实现新的。为什么不是数据库?

关于Java - 以原子方式处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13510328/

相关文章:

java - 嵌套循环将多维数组转换为 Hashmap

java - 了解 JFrame 何时完全绘制

java - 不同的保留政策如何影响我的注释?

java - 使用监听器的奇怪 java 并发问题

java - ConcurrentLinkedQueue 的大小

python - 同时运行两个线程,它们都操作单个变量

C# : Characters do not display well when in Console, 为什么?

java - 将字符串解析为 double[]

c# - 在 C# 中从二进制文件读取数组内容/向二进制文件写入数组内容的最佳方法是什么?

c# - 来自 System.IO.Compression 和异步 I/O 的 ZipFile 和 ZipArchive 类