【发布时间】:2012-07-07 14:09:17
【问题描述】:
我正在开发一个具有生产者-消费者模式的 Java 应用程序。早些时候,生产者没有按顺序产生事件(例如,在“1”之前产生了“2”),但消费者必须按顺序发送它们(例如,“1”然后是“2”然后是“3”等)。考虑到这一点,A TreeSet 被用来维护一个队列,并且正在对其进行按顺序遍历以查看和删除元素。到目前为止,一切都很好。改变的是 Producer 现在按顺序生成事件,因此我决定使用:-
a) LinkedBlockingQueue(它具有队列的基本属性,其中只能访问第一个和最后一个元素,就像在队列中一样)。
b) 使用 LBQ 将我从树集中的 O(log n) 带到 O(1)。
c) 我不再需要写显式同步,ReentrantLock 会处理 LBQ 的 put 和 take 方法。
d) 我不再需要编写显式等待/通知,LBQ 会处理这些。
e) LBQ 有 2 个锁,因此 put 和 take 可以同时在不同的 CPU 上进行。
f) LBQ 使用 CAS 来维护等待线程的队列。
我觉得一切都很好。但我被卡住了,这里有以下问题:-
a) 我需要能够通过收集一些指标来证明使用 LBQ 优于 TreeSet 的优势。我应该在我的 Eclipse 中使用哪个免费的分析器来继续? Visual VM 很好,但有没有更好的选择?(Introscope 将用于我的应用程序的显式运行,而不是我的本地 Eclipse,这是我无法抗拒的约束,TPTP 被拒绝)。
b) 我如何证明由于在 LinkedBlockingQueue 中使用了 2 个锁而增加了吞吐量(这看起来在纸上)?这是我希望看到和证明的一个重要方面。
谢谢
【问题讨论】:
标签: java multithreading profiling