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

pos*_*def 5 java multithreading

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

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

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

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

我故意没有c/p任何代码,因为这将是大块的代码有任何意义..我希望它与上面的描述有一定道理.

谢谢,

Pét*_*rök 8

在Java 5及更高版本中,您可以在列表周围使用CopyOnWriteArrayList或使用同步包装器.在早期的Java版本中,只有后一种选择可用.如果你绝对想要坚持ArrayList你提到的自定义实现,情况也是如此.

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

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

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