6

私はSynchronous Queueの実装を読もうとして
いましたが、私にとってはそれほど簡単ではありません。各ノードがスレッドに関連付けられているリンク リストを使用しているようです。
そして、コア部分はタスクがキューに入れられるのを待つスピンループを使用します。
のようなものの代わりにスピンループが使用されているのはなぜだろうと思っていましたwait/notify
このように、この一定のスピンループのためにコアの1つがなくなりましたよね?
この点を理解し、同期キューの設計を大まかに理解しようとしています。

UPDATE
また、私を悩ませているのは、ウェイタースレッドの開始/停止方法です。

4

1 に答える 1

4

のポイントは、SynchronousQueue通常はまったく非同期である何かを同期することです。あるスレッドがアイテムをキューに入れ、別のスレッドがアイテムを取得しようとします。

SynchronousQueue実際にはキューではありません。容量も内部ストレージもありません。別のプロセスが現在キューに入れようとしている場合にのみ、キューからの取得を許可します。

例:

プロセス A はキューに入れようとします。これは今のところブロックします。プロセス B は、キューから取得しようとします。誰かが入れようとしているので、アイテムは A から B に転送され、両方のブロックが解除されます。

プロセス B はキューから取得しようとしますが、誰も書き込みを試みません。したがって、B は現在ブロックされています。プロセス A はアイテムを入れたいと考えています。アイテムは B に転送され、A と B はブロックされなくなりました。

ブロッキングについて:

Sun/Oracle JRE 実装では、時間指定操作 (「1 秒間試行」など) を行う場合、待機/通知パターンの代わりにポーリングを使用します。これは理にかなっています。時間切れになるまで定期的に再試行します。時間指定のない操作 (「時間がかかっても」など) を使用するparkと、状況が変化した場合に再び起動します。どちらの状況でも、コアの 1 つがループを回転させるために常にビジー状態になることはありませんfor (;;)。この場合の「無期限に再試行する」は、「常に回転している」という意味ではありません。

于 2013-08-26T21:53:05.577 に答える