マルチスレッド システムでの Queue の実装に関して、いくつかの驚きを経験してきました。ここは:-
シナリオ:- 1 つのプロデューサー、1 つのコンシューマー:- プロデューサーが整数をキューに入れます。コンシューマーは単にキューからそれを削除します。
キューの基礎となるデータ構造:- TreeSet (使用するとは考えていませんでした)、LinkedList、LinkedBlockingQueue (サイズは不定)
コード:- キューとしての TreeSet:-
while (i < 2000000) {
synchronized (objQueue) {
if (!(objQueue.size() > 0)) {
try {
objQueue.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Integer x = objQueue.first();
if (x != null) {
objQueue.remove(x);
++i;
}
}
}
編集:-
while (i < 2000000) {
synchronized (objQueue) {
objQueue.add(i);
++i;
objQueue.notify();
}
}
LinkedBlockingQueue の場合:-
while (i < 2000000){
try {
objQueue.put(i);
++i;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Thread.currentThread().interrupt();
}
}
while (i < 2000000) {
try {
objQueue.take();
++i;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Thread.currentThread().interrupt();
}
}
LinkedList の場合:- synchronized と同様のコード。
質問:-
1) Visual VM を介してパフォーマンスを測定したところ、プロデューサー コードの場合、O(log n) 時間かかるにもかかわらず、TreeSet が LinkedBlockingQueue および LinkedList よりもパフォーマンスが優れていることがわかりました。Linked 構造でのオブジェクトの作成は、大きなオーバーヘッドです。 . 理論と実践がまったく異なるのはなぜですか?キューの実装でツリー構造よりもリンクされた配列構造を好むのはなぜですか?
2) TreeSet は LinkedBlockingQueue よりもパフォーマンスが優れている LinkedList よりも優れたパフォーマンスを発揮したため、同期は ReeentrantLock に対して明確な勝者として出てきます。Visual VM の結果を添付できればと思います。記事の投票ではありませんhttp://www.ibm.com/developerworks/java/library/j-jtp10264/index.html
操作は
Dell Vostro 1015、core 2 duo 2.10、2 GB RAM、32 ビット オペレーティング システム、および
JVM: Java HotSpot(TM) Client VM (20.1-b02、混合モード) Java: バージョン 1.6.0_26、ベンダー Sun Microsystems Inc.