Java并发问题

时间:2016-03-09 04:18:50

标签: java concurrency

我知道我们可以设计一个Map,以便使用并发实用程序,它允许单个用户一次修改地图数据。我想知道这种并发行为是否仅适用于put操作,还是适用于size操作。以下代码说明了问题:

这个代码块中有一个线程

if(map.size())
{
    //do something
}

而另一个线程在此块中

map.put(obj);

我想知道size操作是否在put操作完成之前停止,反之亦然。

1 个答案:

答案 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
    }
}