线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析

1.  HashSet与HashMap的联系与区别?

   区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键;

   联系:HashSet的底层就是HashMap,可以参考HashSet的类源码,默认构造方法为:

   public HashSet(){

      map = new HashMap<key,Object>

   }

  就是HashSet只用HashMap的键,而不用他的值,前者的值可以程序员随便指定,反正不用

2.  线程并发库中的集合优路劣之分

 HashMap和HashSet如果在成千上万个线程并发的时候会使cup占满;这时java5线程并发库中开发了新技术并发库集合;可以使用其中的ConcurrentMap,也可以在HashMap的使用时加上同步锁synchronized;其实ConcurrentMap类的编写中就是在重写原来HashMap中的所有方法,只是返回值是原来的方法加上了一个同步锁

3.同步集合

  1  4.下面举一个线程并发库集合中的类的案例应用,这个案例比较贴近改知识点的说明
  2 package com.java5.thread.newSkill;
  3 
  4 import java.util.ArrayList;
  5 import java.util.Collection;
  6 import java.util.Iterator;
  7 import java.util.concurrent.CopyOnWriteArrayList;
  8 
  9 public class CollectionModifyExceptionTest {
 10 
 11     /**
 12      * @param args
 13      */
 14     public static void main(String[] args) {
 15 
 16         //CopyOnWriteArrayList为线程并发库集合中的类,可以避免HashMap中的并发异常
 17         /*
 18          * 直接使用传统的ArrayList会出现各式各样的线程并发异常异常,有兴趣的可以试试
 19          */
 20         Collection<User> users = new CopyOnWriteArrayList<User>();
 21         //Collection<User> users = new ArrayList<User>();
 22         users.add(new User("杨凯", 21));
 23         users.add(new User("杨旋", 20));
 24         users.add(new User("潇洒", 22));
 25         Iterator itrUsers = users.iterator();
 26         while (itrUsers.hasNext()) {
 27             User user = (User) itrUsers.next();
 28             if ("潇洒".equals(user.getName())) {
 29                 users.remove(user);
 30             } else {
 31                 System.out.println(user);
 32             }
 33         }
 34     }
 35 
 36 }
 37 
 38 辅助类:User类
 39 package com.java5.thread.newSkill;
 40 
 41 public class User {
 42 
 43     private String name;
 44     private int age;
 45     User(String name, int age) {
 46         super();
 47         this.name = name;
 48         this.age = age;
 49     }
 50     
 51     public String getName() {
 52         return name;
 53     }
 54 
 55     public void setName(String name) {
 56         this.name = name;
 57     }
 58 
 59     public int getAge() {
 60         return age;
 61     }
 62 
 63     public void setAge(int age) {
 64         this.age = age;
 65     }
 66 
 67     @Override
 68     public int hashCode() {
 69         final int prime = 31;
 70         int result = 1;
 71         result = prime * result + age;
 72         result = prime * result + ((name == null) ? 0 : name.hashCode());
 73         return result;
 74     }
 75     @Override
 76     public boolean equals(Object obj) {
 77         if (this == obj)
 78             return true;
 79         if (obj == null)
 80             return false;
 81         if (getClass() != obj.getClass())
 82             return false;
 83         User other = (User) obj;
 84         if (age != other.age)
 85             return false;
 86         if (name == null) {
 87             if (other.name != null)
 88                 return false;
 89         } else if (!name.equals(other.name))
 90             return false;
 91         return true;
 92     }
 93     @Override
 94     public String toString() {
 95         return "User [age=" + age + ", name=" + name + "]";
 96     }
 97     @Override
 98     protected Object clone() throws CloneNotSupportedException {
 99         return super.clone();
100     }
101     
102 }

 

posted @ 2017-01-08 13:49  chenxiangxiang  阅读(419)  评论(0编辑  收藏  举报