多个线程在Java中修改集合?

时间:2010-04-29 10:05:22

标签: java multithreading

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

  1. 从excel文件中读取,检查几个参数并对数据库中的命中进行查询。然后将这些命中注册为一系列自定义类。任何命中都可能(并且很可能会)不止一次出现,因此这部分代码会检查并更新扩展ArrayList的自定义列表实现中的事件。

  2. 找到每个匹配,执行详细查询并解析输出,以便在(I)中创建的类获取详细信息。

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

    我故意没有c / p任何代码,因为它是大块的代码才有意义..我希望它对上面的描述有所帮助。

    谢谢,

2 个答案:

答案 0 :(得分:8)

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

如果容器的读取频率比写入(更改)的频率高得多,那么

CopyOnWriteArrayList是可行的,根据您的解释,这似乎是正确的。其原子addIfAbsent()方法甚至可以帮助简化您的代码。

[更新] 第二个想法,地图听起来更适合您描述的用例。因此,如果从列表更改为例如地图是一种选择,您应该考虑ConcurrentHashMap。的 [/更新]

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

答案 1 :(得分:3)

只需使用新的java.util.concurrent软件包。

ConcurrentLinkedQueueConcurrentHashMap之类的类已经可供您使用,并且都是线程安全的。