4

キューが複数のスレッドによってアクセスされる予定であるが、現在は単一のメソッドによってのみ変更されている場合getNextInQueue()、キューへのアクセスを同期する最も適切な形式は何ですか?

現在、キューを として宣言しましたConcurrentLinkedQueueが、ロックが解放されるのを複数のスレッドが待機しているデッドロックに到達したくありません。これを処理する別の方法は、キューを同期するのではなく、同期することgetNextInQueue()です。ただし、このコードは将来使用されるため、これも同様に拡張されるとは思いません。(キューに変更を加えるすべてのプログラマーは、操作を確実に同期させる必要があります。)

考え?

4

3 に答える 3

5

最も簡単で最も正しい方法は、 を使用することだと思いますConcurrentLinkedQueue。ただし、これがデッドロックを引き起こすとは思いません。ただし、イテレータを使用する状況を Concurrent ラッパーがどのように処理するかは、よくわかりません。synchronized基になるコレクション (読み取りと書き込み) へのすべての呼び出しをラップする古い方法にフォールバックしなければならなかったことを覚えているようです。ただし、それが Concurrent ラッパーが行っていることだと確信しています。

于 2012-07-10T23:34:58.170 に答える
3

ConcurrentLinkedQueueあり、キューの状態がスレッド間で共有されるデータのみの場合、何も同期する必要はありません。それが並行コレクションを使用するポイントです。何か変なことをしていない限り、生産者と消費者のセットアップは行き詰まるべきではありません。(同じスレッドをプロデューサーとコンシューマーにするようなものです。)

于 2012-07-10T23:35:12.617 に答える
2

同期のみgetNext()を行うのは得策ではありません。そうしたい場合は、 も同期する必要がありますinsert

例:
キューに要素がなく、スレッド AgetNext()がメソッドの実行を試みて完了しなかった場合、スレッド B によって新しいアイテムがキューに挿入される可能性があります。その中の新品です。

要約すると:
一致が重要である場合、私はとどまりますConcurrentLinkedQueue

于 2012-07-10T23:32:44.940 に答える