Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2011-10-31) 内存中有一队列,一线程写,多线程读,如何高效实现

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

内存中有一个长度不固定的队列(或其它数据结构),一线程不断写入,多个线程实时读取(只读不移除)。如何在队列中已写入大量对象的情况下,依然能让读取线程最快读到写入的新数据?

具体一些,有如下要求:

  1. 写入线程将向该队列写入大量对象,如50万个以上,每个对象2K左右2. 读线程可在任何时间开始读取,并可从任意一个索引开始3. 读线程读取时,必须一个接一个,中间不能间隔4. 当读线程读完所有数据后,要等待写线程写入新数据,再读取5. 重要要求:读线程尽可能快地读取到写入的数据

分析:

  1. 该队列必须线程安全2. 所有操作必须考虑在大数据量的情况下性能表现3. 写线程:在队列尾部高效写入4. 读线程:可从任意索引开始,所以必须能快速根据索引定位5. 读线程:可高效取得下一个对象(根据索引定位,或iterator之类)6. 当读线程读完数据后,如何等待写入7. 写入线程写入后,如何通知读线程

首先想到的是jdk5中加入的并发库中的BlockingQueue,但很快否定,因为:

  1. 不能根据索引定位元素2. 仅offer和take有阻塞功能,但我们不能使用其take,所以利用不到该优势

考虑List:

  1. ArrayList:备选,需考虑线程安全2. LinkedList:不需要删除的时候,性能比ArrayList差
comments powered by Disqus