スレッドがイベントを 2 番目のスレッドの着信キューにプッシュするという古典的な問題があります。今回だけは、パフォーマンスにとても興味があります。私が達成したいことは次のとおりです。
- キュー、プロデューサーのプッシュ、レシーバーのポップへの同時アクセスが必要です。
- キューが空の場合、コンシューマーがプロデューサーを待ってキューにブロックするようにします。
最初のアイデアは a を使用することでしたがLinkedBlockingQueue
、すぐにそれが同時実行ではなく、パフォーマンスが低下することに気付きました。一方、私は現在 a を使用していますConcurrentLinkedQueue
が、それでも各出版物にwait()
/のコストを支払っています。notify()
コンシューマーは、空のキューを見つけてもブロックしないため、同期wait()
してロックする必要があります。一方、プロデューサーは、notify()
すべてのパブリケーションでそのロックを取得する必要があります。sycnhronized (lock) {lock.notify()}
全体的な結果として、必要がない場合でも、すべての出版物のコストを私が支払って
います。
ここで必要だと思うのは、ブロックと並行の両方のキューです。プッシュされた要素がリストの最初にある場合、オブジェクトに余分なものを付けて、のpush()
ように機能する操作を想像します。プッシュには次の要素との接続が必要なため、このようなチェックは既に に存在すると考えています。したがって、これは外部ロックで毎回同期するよりもはるかに高速です。ConcurrentLinkedQueue
notify()
ConcurrentLinkedQueue
このようなものは利用可能/合理的ですか?