同步集合類 -筆記整理13
阿新 • • 發佈:2018-12-30
同步集合
1.傳統集合類在併發訪問時的問題說明。
2.傳統方式下用Collections工具類提供的synchronzedCollection方法來獲得同步集合,分析該方法的實現原始碼。
得到的同步集合,是在操作集合的增刪改方法加了鎖,不可以同時操作。
3.Java5種提供瞭如下一些同步集合類:
(1)通過看Java.util.concurrent包下的介紹可以知道有哪些併發集合
ConcurrentHashMap,CopyOnWriteArrayList,CopyOnWriteArraySet.
4.傳統方式下的Collection在迭代集合時,不允許對集合進行修改。
(1)根據
對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; } }