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