Beg*_*ner 4 java synchronization arraylist
在ArrayListapi我们有:
请注意,此实现不同步.如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步.(结构修改是添加或删除一个或多个元素的任何操作,或显式调整后备数组的大小;仅设置元素的值不是结构修改.)这通常通过同步一些自然封装的对象来实现.名单.如果不存在此类对象,则应使用Collections.synchronizedList方法"包装"该列表.
这里的意思是"这通常通过同步一些自然封装列表的对象来完成"?这与并发修改异常有何关系?
这通常通过在自然封装列表的某个对象上同步来完成.如果不存在此类对象,则应使用Collections.synchronizedList方法"包装"该列表.这最好在创建时完成,以防止意外地不同步访问列表:
Run Code Online (Sandbox Code Playgroud)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;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ParkinLot将包装列表spot.如果您尝试呼叫park(),则需要在ParkingLot对象上进行同步,以防止两个线程同时尝试将汽车停放在同一位置.
它与a有关ConcurrentModificationException,因为它可以防止你同时从单独的线程中更改列表(通过同步),这可能使列表处于不一致状态(即两辆车同时停车,认为他们已经成功停放).
| 归档时间: |
|
| 查看次数: |
1043 次 |
| 最近记录: |