Java并发问题

Java并发问题,java,concurrency,Java,Concurrency,我知道我们可以设计一个地图,使用并发实用程序,它允许单个用户一次修改地图数据。我想知道这种并发行为是否只适用于put操作,或者也适用于size操作。以下代码说明了该问题: 这段代码中有一个线程 if(map.size()) { //do something } 当另一个线程在此块中时 map.put(obj); 我想知道大小操作是否会在put操作完成之前停止,反之亦然。简而言之,是:大小必须在互斥锁上等待才能执行。Collections.SynchronizedMap返回由原始映射支

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

这段代码中有一个线程

if(map.size())
{
    //do something
}
当另一个线程在此块中时

map.put(obj);
我想知道大小操作是否会在put操作完成之前停止,反之亦然。

简而言之,是:大小必须在互斥锁上等待才能执行。Collections.SynchronizedMap返回由原始映射支持的同步映射。同步映射的每个公共方法都由一个私有互斥来同步。例如,下面是toString方法:

为了保证串行访问,通过返回的映射完成对备份映射的所有访问至关重要

此外,如果您正在迭代密钥集,则可能需要手动同步:

用户必须手动同步返回的数据 *在迭代其任何集合视图时映射。。。不遵循此建议可能会导致不确定性行为

考虑以下示例:

//inside thread1
if(map.size()>n){
    //do something
    System.out.println(map.size());
}

//inside thread2
map.put(obj);
在这种情况下,thread1的if语句中的map.size值不一定等于//do something块中的map.size打印值。在这种情况下,您必须在地图上手动同步:

synchronize(map){
    if(map.size()>n){
        //do something
    }
}

你最好把我知道的改成我明白/我发现了,打字错误,我想知道的改成我想知道/我需要知道哪个听起来更好。这取决于地图的实施。
synchronize(map){
    if(map.size()>n){
        //do something
    }
}