我正在一个java应用程序有一个生产者 - 消费者模式。早些时候,制作人没有按顺序制作事件(例如,'2'是在'1'之前制作的,但消费者必须按顺序发送它们(例如,'1',然后'2',然后'3'等)。为了说明这个问题,TreeSet被用来维护一个队列,并且为了查看和删除这些元素,在遍历上也是这样做的。到现在为止还挺好。改变的是生产者现在按顺序生成事件,因此我决定使用: -Java分析的可伸缩性和时间复杂性
a)一个LinkedBlockingQueue(它具有队列的基本属性,其中只能访问第一个和最后一个元素,如它应该是一个队列)。 b)使用LBQ使我从树中的O(log n)到O(1)。
c)我不必再写明确的同步了,ReentrantLock负责LBQ的放入和取出方法。
d)我不再需要写明确的等待/通知,LBQ负责处理这个问题。 e)LBQ有2个锁,因此put和take可以同时在不同的CPU上运行。 f)LBQ使用CAS来维护等待线程队列。
所有的事情对我来说都很好。但我卡住了,下面是一些问题: -
a)我需要通过收集一些指标来证明在TreeSet上使用LBQ的优势。我应该在我的eclipse中使用哪个免费的分析器? Visual VM很好,但有没有更好的选择?(Introscope将用于我的应用程序的显式运行,而不是在我的本地eclipse上,这是我无法抗争的一个限制,TPTP被拒绝)。
b)由于在LinkedBlockingQueue中使用了2个锁,我该如何证明吞吐量(看起来在纸上)的增加?这是我希望看到并证明的一个重要方面。
感谢
你最终使用的是什么 – 2012-07-13 23:37:30