私は、生産者と消費者のパターンを持つ Java アプリケーションに取り組んでいます。以前は、プロデューサーはイベントを順番に生成していませんでした (たとえば、'2' は '1' の前に生成されました) が、コンシューマーはそれらを順番に送信する必要がありました (たとえば、'1' の次に '2' の次に '3' など)。これを説明するために、キューを維持するために TreeSet が使用され、要素をピークして削除するために同じ順序でトラバーサルが行われていました。ここまでは順調ですね。変更点は、Producer がイベントを順番に生成するようになったことです。したがって、以下を使用することにしました。
a) LinkedBlockingQueue (本来あるべきキューのように、最初と最後の要素にのみアクセスできるキューの基本的なプロパティを持ちます)。
b) LBQ を使用すると、ツリーセットの O(log n) から O(1) に移動しました。
c) 明示的な同期を記述する必要がなくなりました。ReentrantLock は、LBQ の put および take メソッドを処理します。
d) 明示的な待機/通知を記述する必要がなくなりました。LBQ がそれを処理します。
e) LBQ には 2 つのロックがあるため、プットとテイクは異なる CPU で同時に取得できます。
f) LBQ は CAS を使用して、待機中のスレッドのキューを維持します。
すべてがうまくいっているように思えます。しかし、私は立ち往生しています、ここに次の質問があります:-
a) いくつかのメトリックを収集することによって、TreeSet よりも LBQ を使用する利点を証明できるようにする必要があります。続行するには、Eclipse でどの無料のプロファイラーを使用すればよいですか? Visual VM は問題ありませんが、利用可能なより良いオプションはありますか? (Introscope はアプリケーションの明示的な実行で使用され、ローカル Eclipse では使用されません。これは私が戦うことができない制約であり、TPTP は拒否されます)。
b) LinkedBlockingQueue で 2 つのロックを使用することによるスループットの増加 (紙の上にあるように見えます) をどのように証明すればよいですか? これは、私が見て証明したい重要な側面です。
ありがとう