同步集合类 -笔记整理13

来源:互联网 发布:涡扇15发动机 知乎 编辑:程序博客网 时间:2024/06/03 21:07

同步集合

1.传统集合类在并发访问时的问题说明。

2.传统方式下用Collections工具类提供的synchronzedCollection方法来获得同步集合,分析该方法的实现源码。

 得到的同步集合,是在操作集合的增删改方法加了锁,不可以同时操作。

3.Java5种提供了如下一些同步集合类:

  (1)通过看Java.util.concurrent包下的介绍可以知道有哪些并发集合

     ConcurrentHashMap,CopyOnWriteArrayList,CopyOnWriteArraySet.

4.传统方式下的Collection在迭代集合时,不允许对集合进行修改。

  (1)根据AbstracListcheckForComodification方法的源码,分析产生ConcurrentModificationException异常的原因。

 

CopyOnWriteArrayList对象使用代码示例1

public class CollectionModifyExceptionTest {public static void main(String[] args) {//LinkedList users = new LinkedList();//ArrayList users = new ArrayList();//HashSet users = new HashSet();Collection users = new CopyOnWriteArrayList();//new ArrayList();users.add(new User("张三",28));users.add(new User("李四",25));users.add(new User("王五",31));Iterator itrUsers = users.iterator();//Iterator itrUsers=users.listIterator();   /* 理解iterator() listIterator() 俩个迭代器的去区别list的子类和set、map都可以使用iterator迭代器遍历只有list集合才可以获取listIterator集合,listIterator可以对迭代集合增加,删除元素,方法更多 */while(itrUsers.hasNext()){System.out.println("aaaa");User user = (User)itrUsers.next();if("李四".equals(user.getName())){//itrUsers.remove();          //使用迭代器删除也不会报错,          users.remove(user);        //在使用迭代器进行遍历集合的时候,不允许对集合修改,可以使用并发集合   //通过查看报错源码,在next()方法中维护了一个集合版本,都操作了集合,与期望版本不一致,抛出异常} else {System.out.println(user);}}}} 



public class User implements Cloneable{private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public boolean equals(Object obj) {if(this == obj) {return true;}if(!(obj instanceof User)) {return false;}User user = (User)obj;//if(this.name==user.name && this.age==user.age)if(this.name.equals(user.name) && this.age==user.age) {return true;}else {return false;}}public int hashCode() {return name.hashCode() + age;}public String toString() {return "{name:'" + name + "',age:" + age + "}";}public Object clone()  {Object object = null;try {object = super.clone();} catch (CloneNotSupportedException e) {}return object;}public void setAge(int age) {this.age = age;}public String getName() {return name;}} 


0 0
原创粉丝点击