您的位置:首页 > 编程语言 > Java开发

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

2013-02-12 17:16 891 查看
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.同步集合



4.下面举一个线程并发库集合中的类的案例应用,这个案例比较贴近改知识点的说明
package com.java5.thread.newSkill;

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

public class CollectionModifyExceptionTest {

/**
* @param args
*/
public static void main(String[] args) {

//CopyOnWriteArrayList为线程并发库集合中的类,可以避免HashMap中的并发异常
/*
* 直接使用传统的ArrayList会出现各式各样的线程并发异常异常,有兴趣的可以试试
*/
Collection<User> users = new CopyOnWriteArrayList<User>();
//Collection<User> users = new ArrayList<User>();
users.add(new User("杨凯", 21));
users.add(new User("杨旋", 20));
users.add(new User("潇洒", 22));
Iterator itrUsers = users.iterator();
while (itrUsers.hasNext()) {
User user = (User) itrUsers.next();
if ("潇洒".equals(user.getName())) {
users.remove(user);
} else {
System.out.println(user);
}
}
}

}

辅助类:User类
package com.java5.thread.newSkill;

public class User {

private String name;
private int age;
User(String name, int age) {
super();
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "User [age=" + age + ", name=" + name + "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}

}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐