繁体   English   中英

Java并发问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM