我知道我们可以设计一个Map,以便使用并发实用程序,它允许单个用户一次修改地图数据。我想知道这种并发行为是否仅适用于put
操作,还是适用于size
操作。以下代码说明了问题:
这个代码块中有一个线程
if(map.size())
{
//do something
}
而另一个线程在此块中
map.put(obj);
我想知道size
操作是否在put
操作完成之前停止,反之亦然。
答案 0 :(得分:0)
简而言之,是的:size()
必须等待互斥锁才能执行。 Collections.synchronizedMap(Map)
返回原始地图支持的SynchronizedMap
。 同步映射的每个公共方法都由一个私有互斥锁同步。例如,这是toString()
方法:
public String toString() {
synchronized (mutex) {return m.toString();}
}
为了保证串行访问,必须通过返回的地图完成所有对支持地图的访问。
此外,如果您正在迭代密钥集,则可能需要手动同步:
用户必须手动同步返回的内容 *迭代任何集合视图时的映射...不遵循此建议可能会导致非确定性行为。
考虑以下示例:
//inside thread1
if(map.size()>n){
//do something
System.out.println(map.size());
}
//inside thread2
map.put(obj);
在这种情况下,thread1的map.size()
语句中if
的值不一定等于map.size()
块中//do something
的打印值。在这种情况下,您必须在地图上手动同步:
synchronize(map){
if(map.size()>n){
//do something
}
}