我正在从事的项目需要对数据库进行大量查询。原则上,我使用两种类型的查询:
读取 excel 文件,检查几个参数并查询数据库中的匹配项。然后将这些命中记录为一系列自定义类。任何命中都可能(而且很可能会)发生不止一次,因此这部分代码检查并更新扩展 ArrayList 的自定义列表实现中的匹配。
对于找到的每个命中,进行详细查询并解析输出,以便在 (I) 中创建的类获得详细信息。
我想我会使用多个线程来优化时间。但是,我真的想不出一个好方法来解决存储这些项目的集合所发生的问题。详细说明一下;整个执行对象都应该被(I)和(II)修改。
我故意没有 c/p 任何代码,因为它会是一大堆代码才有意义。我希望上面的描述能理解一些意义。
谢谢,
最佳答案
在 Java 5 及更高版本中,您可以使用 CopyOnWriteArrayList
或 synchronized wrapper around your list .在早期的 Java 版本中,只有后一种选择可用。如果您绝对想坚持使用您提到的自定义 ArrayList
实现,情况也是如此。
CopyOnWriteArrayList
是可行的,如果容器的读取频率比写入(更改)频率高得多,根据您的解释,这似乎是正确的。它的原子 addIfAbsent()
方法甚至可以帮助简化您的代码。
[更新] 仔细想想, map 听起来更适合您描述的用例。因此,如果从列表更改为例如 map 是一种选择,您应该考虑 ConcurrentHashMap . [/更新]
更改容器内的对象不会影响容器本身,但是您需要确保对象本身是线程安全的。
关于java - 多个线程修改 Java 中的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2736378/