线程安全更新hashmap

时间:2012-07-21 07:46:21

标签: java thread-safety hashmap

我有一个HashMap

 Map<Integer ,ArrayList<Double>> map1 = new HasMap<Integer,ArrayList<Double>>()

此映射由多个线程访问和修改。我想为ArrayList的每个组件的粒度级别进行线程安全更新。这意味着,一个值可以被多个线程修改,但是一个组件不能被多个线程修改。我该怎么做?这是否会在迭代时阻止“未定义属性”? iterating values

[编辑]

 key      value
 1000    [0.1,0.002,0.8,0.112]

更新每个值组件。在更新时,第一个组件可以由一个线程更新,第二个组件可以由另一个线程一次更新。我不想只为一个线程锁定一对。

3 个答案:

答案 0 :(得分:1)

我认为你想要的是使用Lock。当您调用lock()时,它将允许您“锁定”资源而不被其他线程使用,然后在该资源上完成更新时调用unlock(),以便其他线程可以对其进行修改。您可以为每个资源创建一个锁。

答案 1 :(得分:1)

使用CopyOnWriteArrayList代替ArrayList,它专门用于多线程,并且比使用互斥/同步的变体(如Vector)执行得更好:

Map<Integer ,List<Double>> map1 = new HashMap<Integer, CopyOnWriteArrayList<Double>>();

(但要注意,如果您执行的更新比读取列表更多)

根据您的评论,您不需要外部Map的任何同步,因为它不会同时修改。

答案 2 :(得分:1)

我认为您可以尝试使用ConcurrentHashMap来实现此目标