同步集合类 -笔记整理13
程序员文章站
2022-06-06 19:13:01
...
同步集合
1.传统集合类在并发访问时的问题说明。
2.传统方式下用Collections工具类提供的synchronzedCollection方法来获得同步集合,分析该方法的实现源码。
得到的同步集合,是在操作集合的增删改方法加了锁,不可以同时操作。
3.Java5种提供了如下一些同步集合类:
(1)通过看Java.util.concurrent包下的介绍可以知道有哪些并发集合
ConcurrentHashMap,CopyOnWriteArrayList,CopyOnWriteArraySet.
4.传统方式下的Collection在迭代集合时,不允许对集合进行修改。
(1)根据AbstracList的checkForComodification方法的源码,分析产生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;
}
}
上一篇: vue快速入门 笔记 +axios
下一篇: 浅析SEO原创文章和软文之间到底有何区别