(1) 简单put操作的时间对比
HashMap | ConcurrentHashMap |
当put操作循环10万次时,得到time = 344ms, | 当put操作循环10万次时,得到time =281ms, |
循环50万次时,得到time = 1657ms, | 循环50万次时,得到time = 1376ms, |
循环100万次时,得到time =4094ms。 | 循环100万次时,得到time =3625ms, |
(2) put操作的最多个数对比(即内存溢出)
HashMap | ConcurrentHashMap |
运行程序,内存初值为:846M,内存峰值为:931M,put计数=1030604 | 运行程序,内存初值为:847M,内存峰值为:931M,put计数=1,030,238
|
(3) HashMap与ConcurrentHashMap 多线程操作的测试
HashMap | ConcurrentHashMap |
当put线程数量为100,get线程数量为90时,HashMap就开始出现性能下降的情形,CPU使用率达到45%左右,且put、get的个数要明显少于ConcurrentHashMap的个数 | 使用ConcurrentHashMap时,则线程很稳定,CPU使用率不超过12%时。 |
在hashMap的基础上,ConcurrentHashMap将数据分为多个segment,默认16个(concurrency level),然后每次操作对一个segment加锁,避免多线程锁得几率,提高并发效率。
hashtable是做了同步的,hashmap未考虑同步。所以hashmap在单线程情况下效率较高。hashtable在的多线程情况下,同步操作能保证程序执行的正确性。
但是hashtable每次同步执行的时候都要锁住整个结构。看下图: