在ArrayList
api中,我们有:
请注意,此实现未同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改列表,则必须在外部进行同步。(结构修改是添加或删除一个或多个元素或显式调整后备数组大小的任何操作;仅设置元素的值不是结构修改。)这通常是通过对某些自然封装了对象的对象进行同步来实现的。清单。如果不存在这样的对象,则应使用Collections.synchronizedList方法“包装”列表。
在这里,“这通常是通过对自然封装列表的对象进行同步来实现的”的含义是什么?这与并发修改异常有何关系?
通常,通过在自然封装列表的某个对象上进行同步来完成此操作。如果不存在这样的对象,则应使用Collections.synchronizedList方法“包装”列表。最好在创建时完成此操作,以防止意外的不同步访问列表:
List list = Collections.synchronizedList(new ArrayList(...));
“自然封装”表示如果列表是对象的字段,但是该列表不可公开访问,则假定以下情况:
class ParkingLot{
private ArrayList<Cars> spots;
public boolean park(int spotNumber, Car car){
if( spots.get(spotNumber)==null){
spot.set(spotNumber,car);
return true;
}
return false;
}
}
在这种情况下,ParkinLot
将列出该列表spot
。如果要尝试调用park()
,则需要在ParkingLot
对象上进行同步,以防止两个线程试图同时将汽车停放在同一位置。
它与的相关性ConcurrentModificationException
在于,它防止您同时(通过同步)更改单独线程中的列表,这可能会使列表处于不一致状态(即,两辆汽车同时认为自己已经成功停车了,因此在停车)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句