java - 多个线程修改 Java 中的集合?

标签 java multithreading

我正在从事的项目需要对数据库进行大量查询。原则上,我使用两种类型的查询:

  1. 读取 excel 文件,检查几个参数并查询数据库中的匹配项。然后将这些命中记录为一系列自定义类。任何命中都可能(而且很可能会)发生不止一次,因此这部分代码检查并更新扩展 ArrayList 的自定义列表实现中的匹配。

  2. 对于找到的每个命中,进行详细查询并解析输出,以便在 (I) 中创建的类获得详细信息。

我想我会使用多个线程来优化时间。但是,我真的想不出一个好方法来解决存储这些项目的集合所发生的问题。详细说明一下;整个执行对象都应该被(I)和(II)修改。

我故意没有 c/p 任何代码,因为它会是一大堆代码才有意义。我希望上面的描述能理解一些意义。

谢谢,

最佳答案

在 Java 5 及更高版本中,您可以使用 CopyOnWriteArrayListsynchronized wrapper around your list .在早期的 Java 版本中,只有后一种选择可用。如果您绝对想坚持使用您提到的自定义 ArrayList 实现,情况也是如此。

CopyOnWriteArrayList 是可行的,如果容器的读取频率比写入(更改)频率高得多,根据您的解释,这似乎是正确的。它的原子 addIfAbsent() 方法甚至可以帮助简化您的代码。

[更新] 仔细想想, map 听起来更适合您描述的用例。因此,如果从列表更改为例如 map 是一种选择,您应该考虑 ConcurrentHashMap . [/更新]

更改容器内的对象不会影响容器本身,但是您需要确保对象本身是线程安全的。

关于java - 多个线程修改 Java 中的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2736378/

相关文章:

python - 如何并行化 scipy 余弦相似度计算

multithreading - 用户级线程会利用多处理吗?

c# - Task.WaitAll 抛出 OperationCanceledException

java - testng 运行多线程吗?

java - 列出所有不再在任何地方使用的已弃用类/方法的工具?

java - Hibernate 无法提取结果集异常 - 多对多关系

java - 三元运算符的编译错误

java - 将持续时间字符串解析为毫秒

android - 使用线程休眠更新 UI

java - 使用 Java 的 codility 中的 PassingCars 问题