19

スレッドセーフな LIFO 構造が必要であり、これには のスレッドセーフな実装を使用できることがわかりましたDeque。Java 7 で導入されConcurrentLinkedDeque、Java 6 で導入されましLinkedBlockingDequeた。

LinkedBlockingDequeなどのノンブロッキングメソッドのみを使用した場合、と に違いはありaddFirst()ますか?removeFirst()ConcurrentLinkedDeque

ConcurrentLinkedDequeつまり、ブロッキングの側面を無視するとLinkedBlockingDeque、境界があること以外に、と の間に他の違いはありLinkedBlockingDequeますか?

4

4 に答える 4

16

偉大なDoug Leaの言葉を引用します(私の強調)

LinkedBlockingDeque と ConcurrentLinkedDeque の比較

LinkedBlockingDeque クラスは、「標準」のブロッキング両端キュー クラスを意図しています。現在の実装のオーバーヘッドは比較的低いですが、スケーラビリティは比較的貧弱です。...

... ConcurrentLinkedDeque は、 LinkedBlockingDeque とほぼ反対のパフォーマンス プロファイルを持っています比較的高いオーバーヘッドですが、非常に優れたスケーラビリティです。... 並行アプリケーションでは、スレッドセーフでありながらブロッキングをサポートしていない Deque が必要になることは、それほど一般的ではありません。そして、それらのほとんどは、おそらく特別なケースのソリューションを使用したほうがよいでしょう.

LinkedBlockingDeque彼は、 の機能が特に必要でない限り、を使用するべきだと提案しているようですConcurrentLinkedDeque

于 2013-10-04T11:24:02.453 に答える
12

ConcurentLinkedDequeue はロックフリー (ソース コードのコメントを参照) ですが、LinkedBlockingQueue はロックを使用します。つまり、前者の方が効率的であるはずです

于 2013-10-04T11:21:03.347 に答える
9

2つのこと:

1:LinkedBlockingDequeなど で非ブロッキング メソッドのみを使用した場合、と に違いはありaddFirst()ますか?removeFirst()ConcurrentLinkedDeque

これらのメソッドには、同時ロック動作に関して次のような違いがありますLinkedBlockingDeque

public E removeFirst() {
        E x = pollFirst();
        ..
    }
 public E pollFirst() {
        lock.lock(); //Common lock for while list
        try {
            return unlinkFirst();
        } finally {
            lock.unlock();
        }
    }

メソッドについても同様ですaddFirst。このConcurrentLinkedDequeロック動作では、両方の方法が異なり、リスト全体をロックするのではなく、そのサブセットをロックするため、より効率的です。ソースを確認すると、ConcurrentLinkedDequeこれがより明確になります。

2:の javadoc からConcurrentLinkedDeque:

ほとんどのコレクションとは異なり、size メソッドは一定時間の操作ではないことに注意してください。

..

さらに、一括操作 addAll、removeAll、retainAll、containsAll、equals、および toArray は、アトミックに実行されるとは限りません。

上記は当てはまりませんLinkedBlockingDeque

于 2013-10-04T11:28:45.550 に答える
4

まず、LinkedBlockingDeque と ConcurrentLinkedDeque はどちらもスレッド セーフですが、どちらを使用するかはアプリケーションの要件によって異なります。

例えば、

LinkedBlockingDequeue : 一度に 1 つのスレッドのみがデータを操作できるようにする場合や、アプリケーションのブロックが必要な場合は、このコレクションを使用します。

ConcurrentLinkedDeque: これもスレッドセーフなコレクション deque です。アプリケーションがマルチスレッドで、各スレッドがデータにアクセスできるようにする場合は、ConcurrentLinkedDequeue が最適です。

あなたの質問のように、

1. スレッドセーフな LIFO 構造が必要です。

一度に 1 つのスレッドだけがデータを操作できるようにする場合は、LinkedBlockingDeque を使用します。

各スレッドが共有データにアクセスできるようにする場合は、ConcurrentLinkedDeque を使用します。

2. ブロッキングの側面を無視した場合、ConcurrentLinkedDeque と LinkedBlockingDeque の間に他に何か違いはありますか?

はい、LinkedBlockingDeque はロック メカニズムを使用しており、ConcurrentLinkedDeque は使用していないため、違いがあります。これは、データを操作するときにパフォーマンスに影響を与える可能性があります。

于 2017-05-13T13:57:02.633 に答える