集合类同步性能分析

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
 
import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
 
public class CollectionDemo {
 
	public static void main(String[] args){
		testConcurrentList();
		testConcurrentMap();
	}
 
	public static void testConcurrentList(){
		long start = System.currentTimeMillis();
		long list_time = 0;
		List list = new ArrayList();
		for(int i = 0; i < 1000000; i++){
			list.add(i);
		}
		for(int i = 0; i < list.size(); i++){
			int k = (Integer) list.get(i);
		}
		list_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long vector_time = 0;
		Vector vec = new Vector();                    
// public synchronized void insertElementAt  同步所有方法
		for(int i = 0; i < 1000000; i++){
			vec.add(i);
		}
		for(int i = 0; i < vec.size(); i++){
			int k = (Integer) vec.get(i);
		}
		vector_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long concurrentList_time = 0;
        List concurrentList = Collections.synchronizedList(new ArrayList());  
// synchronized(mutex)同步需要同步的代码块
		for(int i = 0; i < 1000000; i++){
			concurrentList.add(i);
		}
		for(int i = 0; i < concurrentList.size(); i++){
			int k = (Integer) concurrentList.get(i);
		}
		concurrentList_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long copyOnWriteArrayList_time = 0;
		CopyOnWriteArrayList  copyOnWriteArrayList = new CopyOnWriteArrayList();  
//重入锁(ReentrantLock)是一种递归无阻塞的同步机制。
		for(int i = 0; i < 1000000; i++){
			concurrentList.add(i);
		}
		for(int i = 0; i < copyOnWriteArrayList.size(); i++){
			int k = (Integer) copyOnWriteArrayList.get(i);
		}
		copyOnWriteArrayList_time = System.currentTimeMillis() - start;
 
		System.out.println("list--------------- vector--------------
Collections.synchronizedList(new ArrayList()) --------CopyOnWriteArrayList");
        System.out.println(list_time + "------------" + vector_time + "------------" 
+ concurrentList_time + "------------" + copyOnWriteArrayList_time);
	}
	public static void testConcurrentMap(){
		long start = System.currentTimeMillis();
		long map_time = 0;
		Map map = new HashMap();
		for(int i = 0; i < 1000000; i++){
			map.put("item" + i,"value" + i);
		}
		for(int i = 0; i < map.size(); i++){
			Object value = map.get("item" + i);
		}
		map_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long ht_time = 0;
		Hashtable ht = new Hashtable();
		for(int i = 0; i < 1000000; i++){
			ht.put("item" + i,"value" + i);
		}
		for(int i = 0; i < ht.size(); i++){
			Object value = ht.get("item" + i);
		}
		ht_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long concurrentMap_time = 0;
        Map concurrentMap = Collections.synchronizedMap(new HashMap());
        for(int i = 0; i < 1000000; i++){
        	concurrentMap.put("item" + i,"value" + i);
		}
		for(int i = 0; i < concurrentMap.size(); i++){
			Object value = concurrentMap.get("item" + i);
		}
		concurrentMap_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long copyOnWriteArrayMap_time = 0;
		ConcurrentHashMap  concurrentHashMap = new ConcurrentHashMap();
		for(int i = 0; i < 1000000; i++){
			concurrentHashMap.put("item" + i,"value" + i);
		}
		for(int i = 0; i < concurrentHashMap.size(); i++){
			Object value = concurrentHashMap.get("item" + i);
		}
		copyOnWriteArrayMap_time = System.currentTimeMillis() - start;
 
		System.out.println("map--------------- hashTable--------------
Collections.synchronizedMap(new HashMap()); --------ConcurrentHashMap");
        System.out.println(map_time + "------------" + ht_time 
+ "------------" + concurrentMap_time + "------------" 
+ copyOnWriteArrayMap_time);
	}
}

 

输出:

数据量 List vector Collections.synchronizedList CopyOnWriteArrayList
1000000 62 125 172 47
5000000 485 953 1031 625
10000000 1078 1812 2329 2343

List如果需要同步,建议使用CopyOnWriteArrayList。如果不需要同步,则用list即可,不需要用同步,因为同步消耗很大的性能。

数据量 HashMap Hashtable Collections.synchronizedMap CopyOnWriteArrayMap
1000000 1375 1094 1469 1547
5000000 6860 6281 7688 8172
100000 78 125 78 94

Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;在数据量大的时候,hashtable的性能比较好,但是hashmap的功能更加强大,而且新框架中建议使用hashmap,不要使用hashtable。

没有同步的list,用同步的三种方式实现的list性能分析:
1.用老的Vector/Hashtable类,上面2个问题都不用担心。
Vector/Hashtable所提供的所有方法都是 synchronized的。如果 迭代的过程中数据结构被修改了,迭代器可以反映最新的修改,也不会抛异常。但这种方法效率低下,不建议使用。
2.使用ArrayList/HashMap和同步包装器
可用 同步包装器使容器变成线程安全的 对某些方法用synchronized
Java代码
1. List synchArrayList = Collections.synchronizedList(new ArrayList());

2. Map synchHashMap = Collections.synchronizedMap(new HashMap())

3.用java5.0新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet
对这些集合进行并发修改是安全的。 用重入锁(ReentrantLock)是一种递归无阻塞的同步机制实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值