[英]Java Concurrency Issue
我知道我们可以设计一个地图,以便使用并发实用程序,它允许单个用户一次修改地图数据。 我想知道这种并发行为是否仅适用于put
操作或还专门用于size
操作。 下面的代码说明了这个问题:
一个线程在这个代码块中
if(map.size())
{
//do something
}
而另一个线程在这个块中
map.put(obj);
我想知道size
操作是否会在put
操作完成之前停止,反之亦然。
简而言之,是的: 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);
在这种情况下, map.size()
的if
语句中map.size()
的值不一定等于//do something
块中map.size()
的打印值。 在这种情况下,您必须在地图上手动同步:
synchronize(map){
if(map.size()>n){
//do something
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.