【发布时间】:2011-08-20 20:56:13
【问题描述】:
我需要使用 <String, ArrayList<String>> 形式的 HashMap
由几个不同的线程访问。据我了解, ConcurrentHashMap 是首选方法。但是map的值是一个ArrayList会不会有什么问题呢?我是否必须将值定义为同步的 ArrayList 或类似的东西?
【问题讨论】:
标签: java concurrency arraylist hashmap
我需要使用 <String, ArrayList<String>> 形式的 HashMap
由几个不同的线程访问。据我了解, ConcurrentHashMap 是首选方法。但是map的值是一个ArrayList会不会有什么问题呢?我是否必须将值定义为同步的 ArrayList 或类似的东西?
【问题讨论】:
标签: java concurrency arraylist hashmap
是的,可能有问题。 ConcurrentHashMap 对 Map 的访问是线程安全的,但提供的 List 需要是线程安全的,如果多个线程可以同时对同一个 List 实例进行操作。
如果是这样,请使用线程安全列表。
编辑——现在我想起来了,兔子洞走得更远了。你有你的地图,你有你的列表,你有列表中的对象。任何多线程可以修改的东西都应该是线程安全的。因此,如果许多线程可以修改 Lists 中的 Map、Lists 和 Objects,那么所有这些都应该具有线程安全防护。如果只有 Map 和 List 实例可以并发修改,那么只有它们需要线程安全。如果多个线程可以读取所有内容,但不能修改,那么您不需要任何线程安全(我想,如果这是错误的,有人会纠正我)
【讨论】:
<String, List<String>> 作为地图的类型参数,而不是 <String, someSpecialListType<String>>。然后你可以放入任何你想要的列表——通常你不需要知道哪个实现。
ConcurrentHashMap 保证其变异方法的原子性,例如putIfAbsent、computeIfAbsent、computeIfPresent,所以如果所有的修改都通过这些方法完成,就不会出现问题。
但同时,多个线程可以读取同一个映射条目(允许并发读取)。因此多个线程可以访问和修改不安全的集合(映射值)
【讨论】: