java - 多线程程序中的数据不一致

标签 java multithreading parallel-processing apache-storm

我在使用多线程编程时遇到数据一致性问题。

用例:我将在队列中获取消息(人员信息)。我有一个多线程代码,它从队列中获取数据并将其放入另一个数据库。这里我需要比较人员信息,如果有重复的,我需要合并/更新并插入到另一个数据库。

问题:如果两个相似的人物对象同时在两个不同的线程中,那么两者都认为这个人不在第二个数据库中,并且都尝试插入它 - 所以在这里我们会有重复的记录。

如何解决上述问题?

Conceptually if I get to know how to do, I can code for this in Java or am using Apache storm and run parallel process.

最佳答案

可能的解决方案:

  1. 插入队列时检查重复项。除了队列之外还维护一个哈希表。每次插入队列时,检查数据是否已经在哈希表中。如果是这样,请丢弃插入物。插入的复杂度仍然是 O(1),但增加了内存成本。

  2. 不是插入到单个队列,而是根据哈希值插入到多个队列。一个消费者线程处理一个队列。这也是维护时序数据的常用方式。

关于java - 多线程程序中的数据不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30126783/

相关文章:

java - 在构造函数(java)中查询数据库?

multithreading - VMWare 虚拟机环境中的多线程

java - 我如何使用游标实现 Hibernate 分页(因此结果保持一致,尽管新数据被添加到被分页的表中)?

java - 如何使用Java在quartz中从下午2点到晚上11点每30秒触发一次触发器?

java - JTable 中一列的多个单元格渲染器?

java - 并行 JUnit 测试不执行关闭 Hook

java - 并行读取文件时内存不足

java.lang.RuntimeException : Can't create handler inside thread that has not called Looper. 准备()

java - 如何访问 ThreadPoolExecutor 中正在运行的线程?

linux - Bash:在多个内核上运行相同的程序