我正在开发一个具有生产者-消费者模式的 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 个锁而增加了吞吐量(这在纸上看起来是有的)?这是我想看到和证明的一个重要方面。
谢谢