3

ReentrantLock を使用すると、スレッドは同じロックを再帰的に取得できるため、連続するロック/ロック解除でロック カウントが増減します。一方、ロック カウントは、他のスレッドに解放される前にゼロにデクリメントする必要があります。

なぜ、またはどのような状況で、再帰的にロックを取得するコードを書くのでしょうか?

この機能を持つ唯一のポイントは、メソッド (実行中にロックを取得する) が再帰的に呼び出される再帰コードを書きやすくすることです。

スレッドによるロックの再帰的/反復的な取得が役立つ可能性がある他の状況はありますか?

質問の明確化:

  • 再入可能なロックは無視してください。たまたま、再入可能ロックによって再帰性が提供されます。
  • ロックの再帰的な機能について言及しています
  • 再入可能ロックを使用する理由については回答しないでください。
  • 「再帰性はリエントラントロックの主な特徴ではない」と答えないでください
  • ロックが再入可能かどうかに関係なく、どのような状況でロックを再帰的に取得する必要があるかを知りたいです。
4

1 に答える 1

1

よく検索することもできます: これは役立つはずです

再入可能ロックの使用例:

再入可能ロックのアプリケーションの (やや一般的で不自然な) 例は、次のようになります。

  1. グラフをトラバースするアルゴリズムを含む計算があります (おそらくサイクルを含む)。トラバーサルは、サイクルまたは同じノードへの複数のパスが原因で、同じノードを複数回訪問する場合があります。

  2. データ構造は同時アクセスの対象であり、何らかの理由で、おそらく別のスレッドによって更新される可能性があります。競合状態による潜在的なデータ破損に対処するために、個々のノードをロックできる必要があります。何らかの理由 (おそらくパフォーマンス) で、データ構造全体をグローバルにロックしたくない場合があります。

  3. どのノードにアクセスしたかについての完全な情報を計算で保持できないか、「以前にここにいたことがありますか」という質問に迅速に回答できないデータ構造を使用しています。

  4. この状況の例としては、バイナリ ヒープとして実装されたプライオリティ キューを使用したダイクストラのアルゴリズムの単純な実装、または単純なリンク リストをキューとして使用する幅優先検索があります。このような場合、既存の挿入のキューをスキャンするのは O(N) であり、反復ごとに実行したくない場合があります。

この状況では、既に取得したロックを追跡するのはコストがかかります。ノード レベルでロックを行いたい場合、再入可能なロック メカニズムにより、以前にノードにアクセスしたことがあるかどうかを確認する必要がなくなります。ノードをやみくもにロックできます。おそらく、ノードをキューからポップした後にロックを解除します。

于 2014-10-24T06:54:28.810 に答える