Android开发之Java并发包集合类性能分析 Android开发技术

  上一次我们主要分析了Java集合类在单线程和多线程下的性能 Android开发之Java集合类性能分析,今天Android123就并发包concurrent库中的集合类性能做简单的评估分析。

  并发包java.util.concurrent库是JDK 1.5中加入的,Android可以很好的支持,在线程的控制和同步管理方面比Thread有更好的表现,就其中的ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet以及ArrayBlockingQueue和前面的HashMap、ListArray、Set以及Queue最简单的性能对比在多线程下。

  一、ConcurrentHashMap是线程安全版的HashMap,它的构造同样有initialCapacity和loadFactor系数属性,但是还多了一个concurrentcyLevel,默认空构造方法下,这三个值为16、0.75和16。在ConcurrentHashMap内部并不是通过synchronized实现同步的,如果传入的对象value为null将会抛出空指针异常,而防止冲突仍然使用java Object类的hashcode方法实现的。

  1) 单线程下,100个元素

  ConcurrentHashMap 的添加效率远差于 HashMap,不过整体一般的应用几乎感觉不到。

  2) 多线程下,100个元素

  在10个线程下它们两个的性能差不多,不过这时候ConcurrentHashMap性能已经超越了HashMap无论元素多少,而随着线程数的增加效率提升明显,不过对于Android手机这样的应用,应用超过10个线程可能不是很多,不过对于Java VM而言,并发包在多线程下性能优势明显,强烈推荐。

  二、CopyOnWriteArrayList是一个线程安全版的ArrayList,但在读取元素时CopyOnWriteArrayList是无锁的,通过这点可以看出它的内部并不是简单实用synchronized关键字实现加锁的,对于并发包来说内部使用了ReentrantLock实现线程安全访问的。对于元素增加来说CopyOnWriteArrayList的新内存分配是通过创建一个比原始大1的缓冲区,将老的数据复制到新的缓冲区,新增的元素加到数组尾部实现元素添加的。删除时也是通过ReentrantLock实现的,比ArrayList的删除操作复杂一些,首先创建一个比当前数组元素少1的缓冲区,然后复制现有的数组到缓冲区,但复制的过程中比现有的数组少1,和添加元素正好相反。Android开发网提示大家CopyOnWriteArrayList使用的添加和删除并不是类似ArrayList那样简单的System.arrayCopy,所以性能上肯定和ArrayList有些出入。

  1) 单线程下,100个元素

  CopyOnWriteArrayList在元素添加、删除时比ArrayList慢了近一倍,但查找性能没有多大变化,但是随着元素的增加,在单线程下CopyOnWriteArrayList效率大不如ArrayList,在元素数量达到100以后时。

 2) 多线程下,100个元素

  这里Android123主要测试手机上可能发生的10个线程,这样环境下CopyOnWriteArrayList的添加和删除效率也是远不如ArrayList,但查找效率已经快于ArrayList,当元素增加到10000个时,他们的添加和删除效率相当,但CopyOnWriteArrayList的查找效率远大于ArrayList。

  三、CopyOnWriteArraySet 是基于CopyOnWriteArrayList的,由于Set机制不允许重复,所以CopyOnWriteArraySet的add方法在处理元素添加时,调用CopyOnWriteArrayList内部的addIfAbsent方法,如果存在了则返回,不过仍然效率不是很理想。在添加时由于做了额外的操作,所以再添加时比CopyOnWriteArrayList慢,其他和CopyOnWriteArrayList相同。

  四、ArrayBlockingQueue 从名字来看就知道是一个队列,不过属于FIFO的线程安全队列,结构类似栈。

本人擅长Ai、Fw、Fl、Br、Ae、Pr、Id、Ps等软件的安装与卸载,精通CSS、JavaScript、PHP、ASP、C、C++、C#、Java、Ruby、Perl、Lisp、Python、Objective-C、ActionScript、Pascal等单词的拼写,熟悉Windows、Linux、OS X、Android、iOS、WP8等系统的开关机。

通过下面的方式来联系我们:

电邮:138762189@qq.com

联系QQ:点击这里给我发消息

官方站:www.tadke.com

※ ※ 联系请加我的企鹅号 ※※

※ ※技术支持请微信联系站长 ※※

Copyright © 2023 Tadke.com. 琼ICP备20000547号