同步ArrayList

初学者

ArrayListapi中,我们有:

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

在这里,“这通常是通过对自然封装列表的对象进行同步来实现的”的含义是什么?这与并发修改异常有何关系?

破坏者

ArrayList

通常,通过在自然封装列表的某个对象上进行同步来完成此操作。如果不存在这样的对象,则应使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

同步ArrayList

来自分类Dev

同步ArrayList与同步方法块

来自分类Dev

同步访问arrayList

来自分类Dev

同步ArrayList并等待

来自分类Dev

从arraylist取消同步数组

来自分类Dev

迭代ArrayList时同步对象

来自分类Dev

Arraylist同步仅添加呼叫

来自分类Dev

为什么我必须同步线程的ArrayList?

来自分类Dev

从Java 8中的流收集同步的arraylist

来自分类Dev

删除同步方法中的 ArrayList 元素

来自分类Dev

将对象添加到同步ArrayList的MultiThread方法

来自分类Dev

在ArrayList上工作的两种方法的同步

来自分类Dev

在ArrayList中设置元素的值时是否需要同步

来自分类Dev

即使有同步块,ArrayList也不是线程安全的吗?

来自分类Dev

如何显示arraylist java的不同步性?

来自分类Dev

如果我们可以使ArrayList同步,那么Vector的需求是什么?

来自分类Dev

减少Java中同步块的范围会意外损坏我的ArrayList,为什么会这样?

来自分类Dev

减小Java中同步块的大小会意外损坏我的ArrayList,为什么会这样?

来自分类Dev

如果我们可以使ArrayList同步,那么Vector的需求是什么?

来自分类Dev

同步同步查找

来自分类Dev

ArrayList的ArrayList

来自分类Dev

实时同步

来自分类Dev

使WebMQ同步

来自分类Dev

CUBLAS的同步

来自分类Dev

线程同步?

来自分类Dev

同步选择

来自分类Dev

同步使用

来自分类Dev

同步时区

来自分类Dev

实例同步