同步ArrayList

Beg*_*ner 4 java synchronization arraylist

ArrayListapi我们有:

请注意,此实现不同步.如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步.(结构修改是添加或删除一个或多个元素的任何操作,或显式调整后备数组的大小;仅设置元素的值不是结构修改.)这通常通过同步一些自然封装的对象来实现.名单.如果不存在此类对象,则应使用Collections.synchronizedList方法"包装"该列表.

这里的意思是"这通常通过同步一些自然封装列表的对象来完成"?这与并发修改异常有何关系?

van*_*ale 8

来自ArrayList

这通常通过在自然封装列表的某个对象上同步来完成.如果不存在此类对象,则应使用Collections.synchronizedList方法"包装"该列表.这最好在创建时完成,以防止意外地不同步访问列表:

   List list = Collections.synchronizedList(new ArrayList(...));
Run Code Online (Sandbox Code Playgroud)

通过"自然封装"意味着如果列表是对象的字段,但列表不可公开访问,则假设如下:

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,因为它可以防止你同时从单独的线程中更改列表(通过同步),这可能使列表处于不一致状态(即两辆车同时停车,认为他们已经成功停放).