シングル スレッド アプリケーションでデッドロックが発生する可能性はありますか? もしそうなら、例を挙げてください。
5 に答える
はい、再入可能でないロックがあり、スレッドが既に所有しているロックを再取得しようとすると (再帰呼び出しなど)、シングルスレッド アプリケーションはデッドロックする可能性があります。
編集:投稿に「Java」というタグが付けられていることがわかりました。それが更新だったのか、以前に見逃していたのかはわかりませんが、いずれにせよ Java のロックは再入可能であるため、この方法でシングルスレッド アプリケーションをデッドロックすることはできません。
はい、アプリケーションが別のアプリケーションとリソースを共有している場合、デッドロックが発生する可能性があります。
質問をどのように解釈するかによって少し異なります。他のアプリケーションと共有されているリソースが関係している場合は、はい。共有リソースがなければ、いいえ。
デッドロックとは、競合する 2 つ以上のアクションが他のアクションの終了を待っている状況であり、どちらも終了することはありません。
単一のスレッドでは、アクションは 1 つしかなく、それ自体と競合することはできません。
ウィキペディアから:
必要条件
EG Coffman による 1971 年の記事で最初に説明されたコフマン条件として知られる、デッドロックが発生するための 4 つの必要十分条件があります。
- 相互排除条件: 一度に複数のプロセスで使用できないリソース
- 保留および待機条件: すでにリソースを保持しているプロセスは、新しいリソースを要求する場合があります
- プリエンプションなしの条件: リソースを保持しているプロセスからリソースを強制的に削除することはできません。リソースは、プロセスの明示的なアクションによってのみ解放できます。
- 循環待機状態: 2 つ以上のプロセスが循環チェーンを形成し、各プロセスがチェーン内の次のプロセスが保持するリソースを待機します。
この定義では、デッドロックを構成するには 2 つのプロセスが必要です。
スレッドAはリソース1を取得し、リソース1を再取得しようとします。自己ループ状態。
スレッドはlock1->クリティカルセクションで実行->lock1->infinitewait==セルフデッドロックを取得しようとします。これを解決するには、再帰的なロックが必要になります。