遇到java 多线程和容器的问题,请高手来帮个忙
简单说来我想同时运行2个线程,线程都对一个容器(ArrayList或者其他)操作(增删等),现在出现ConcurrentModificationException异常。...
简单说来 我想同时运行2个线程,线程都对一个容器(ArrayList或者其他)操作(增删等),现在出现 ConcurrentModificationException异常。
展开
展开全部
ArrayList是非同步集合,HashMap也是。更进一步说Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
所以你可以使用Vector类代替ArrayList,Hashtable 代替HashMap问题就基本可以解决了。此外synchronizedMap和synchronizedList也可以部分解决问题(这两个被称为有条件的线程安全,所有 单个的操作都是线程安全的,但是多个操作组成的操作序列却可能导致数据争用)。例如:Collections.synchronizedMap(new HashMap())
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
所以你可以使用Vector类代替ArrayList,Hashtable 代替HashMap问题就基本可以解决了。此外synchronizedMap和synchronizedList也可以部分解决问题(这两个被称为有条件的线程安全,所有 单个的操作都是线程安全的,但是多个操作组成的操作序列却可能导致数据争用)。例如:Collections.synchronizedMap(new HashMap())
展开全部
一楼说得对,你这个涉及到数据共步安全问题,为了保证同一个时间只能有一个线程在修改容器数据,你要用到线程锁synchronized ,直到一个线程用完这个容器别的数据才可以访问。
synchronized 的具体用法你可以看jdk api或都百度了。
synchronized 的具体用法你可以看jdk api或都百度了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
多线程同时操作一个数据的话 一定要用synchronized ..
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询