我有一个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]
更新每个值组件。在更新时,第一个组件可以由一个线程更新,第二个组件可以由另一个线程一次更新。我不想只为一个线程锁定一对。
答案 0 :(得分:1)
我认为你想要的是使用Lock。当您调用lock()
时,它将允许您“锁定”资源而不被其他线程使用,然后在该资源上完成更新时调用unlock()
,以便其他线程可以对其进行修改。您可以为每个资源创建一个锁。
答案 1 :(得分:1)
使用CopyOnWriteArrayList
代替ArrayList,它专门用于多线程,并且比使用互斥/同步的变体(如Vector
)执行得更好:
Map<Integer ,List<Double>> map1 = new HashMap<Integer, CopyOnWriteArrayList<Double>>();
(但要注意,如果您执行的更新比读取列表更多)
根据您的评论,您不需要外部Map
的任何同步,因为它不会同时修改。
答案 2 :(得分:1)
我认为您可以尝试使用ConcurrentHashMap
来实现此目标