19-Java5同步集合类的应用

 

范例:在迭代集合的时候修改集合的

package cn.itcast.demo.thread;

import cn.itcast.demo.po.User;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionsModifyExceptionTest {
	public static void main(String[] args) {
		Collection<User> users = new ArrayList<User>();
		users.add(new User("张三", 20));
		users.add(new User("李四", 21));
		users.add(new User("王五", 22));
		
		Iterator<User> userIterator = users.iterator();
		while (userIterator.hasNext()) {
			User user = userIterator.next();
			if ("张三".equals(user.getName())) {
				users.remove(user);
			} else {
				System.out.println(user);
			}
		}
	}
}
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
	at java.util.ArrayList$Itr.next(ArrayList.java:831)
	at cn.itcast.demo.thread.CollectionsModifyExceptionTest.main(CollectionsModifyExceptionTest.java:17)

改成李四

User [name=张三, age=20]

改成王五

User [name=张三, age=20]
Exception in thread "main" User [name=李四, age=21]
java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
	at java.util.ArrayList$Itr.next(ArrayList.java:831)
	at cn.itcast.demo.thread.CollectionsModifyExceptionTest.main(CollectionsModifyExceptionTest.java:17)

以上异常要查看源代码才能分析清楚(底层代码大概是用外部传入的集合元素的数目是否和自定义的成员变量相等,来判断集合是否被修改过)

以上的List集合是线程不安全的

改进代码:希望把指定的元素删除掉,同时程序不报错,要想实现这个功能,需要用到Java5的并发集合CopyOnWriteArrayList<E>

package cn.itcast.demo.thread;

import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;

import cn.itcast.demo.po.User;

public class CollectionsModifyExceptionTest {
    public static void main(String[] args) {
        Collection<User> users = new CopyOnWriteArrayList<User>();
        users.add(new User("张三", 20));
        users.add(new User("李四", 21));
        users.add(new User("王五", 22));
        
        Iterator<User> userIterator = users.iterator();
        while (userIterator.hasNext()) {
            User user = userIterator.next();
            if ("张三".equals(user.getName())) {
                users.remove(user);
            } else {
                System.out.println(user);
            }
        }
    }
}
User [name=李四, age=21]
User [name=王五, age=22]

改成李四

User [name=张三, age=20]
User [name=王五, age=22]

改成王五

User [name=张三, age=20]
User [name=李四, age=21]

 

posted @ 2017-08-21 22:13  半生戎马,共话桑麻、  阅读(179)  评论(0)    收藏  举报
levels of contents