Java 值为ArrayList的ConcurrentHashMap

Java 值为ArrayList的ConcurrentHashMap,java,concurrency,arraylist,hashmap,Java,Concurrency,Arraylist,Hashmap,我需要使用一个格式为的HashMap,它将 由几个不同的线程访问。据我所知,ConcurrentHashMap是首选方法。但是映射的值是ArrayList这一事实会有任何问题吗?是否必须将该值定义为synchronized ArrayList或类似的内容?是的,可能存在问题。ConcurrentHashMap对于访问映射是线程安全的,但是如果多个线程可以同时在同一个列表实例上操作,那么提供的列表需要是线程安全的 因此,如果这是真的,请使用线程安全列表 编辑--现在我想起来了,兔子洞更进一步了。你

我需要使用一个格式为
的HashMap,它将
由几个不同的线程访问。据我所知,ConcurrentHashMap是首选方法。但是映射的值是ArrayList这一事实会有任何问题吗?是否必须将该值定义为synchronized ArrayList或类似的内容?

是的,可能存在问题。ConcurrentHashMap对于访问映射是线程安全的,但是如果多个线程可以同时在同一个列表实例上操作,那么提供的列表需要是线程安全的

因此,如果这是真的,请使用线程安全列表


编辑--现在我想起来了,兔子洞更进一步了。你有你的地图,你有你的列表,你有列表中的对象。多线程可以修改的任何内容都应该是线程安全的。因此,如果许多线程可以修改列表中的映射、列表和对象,那么所有这些线程都应该有线程安全防护。如果只有Map和List实例可以同时修改,那么只有它们需要线程安全性。如果多个线程可以读取所有内容,但不能修改,那么您就不需要任何线程安全性(我认为,如果这是错误的,有人会纠正我)

我明白了……那么如何使用线程安全列表呢?我是说,如何初始化ConcurrentHashMap?我无法编写新的ConcurrentHashMap()…假设访问同一个列表的机会非常少,那么在从HashMap获取列表后,只需在列表上进行同步(synchronize(List){})就可以了。否则,Collections.synchronizedList()仍将返回一个普通列表,因此您不必更改hashmap的签名-只需确保将同步列表添加到映射中即可。@Moshe:要使Voo的注释更清晰,请使用
作为映射的类型参数,而不是
。然后,您可以放入任何您想要的列表-通常,您不需要知道是哪个实现。