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