Javaのデッドロックとは何ですか?どうすればそれを防ぐことができますか?
Javaのデッドロックは、2つ以上のスレッドが永遠にブロックされているときに発生します。それぞれが、一貫性のないロックの順序によって引き起こされる円形の待機のために、他のリソースが保持するリソースを待っています。これは、必要な条件の4つのいずれか、つまり、一貫したグローバルな順序でロックを取得するなどの4つの除外、保留、待機、先制、または円形の待機を破ることで防止できます。オブジェクト、およびネストされたロックの回避。最も効果的なアプローチは、一貫したロックの順序付けと手動の同期への依存度の低下であり、スレッドがデザインによって無期限に互いに待たないようにします。
Javaのデッドロックは、2つ以上のスレッドが永遠にブロックされ、それぞれが別のスレッドが保持するリソースを待っているときに発生します。これは通常、スレッドが異なる注文でロックを取得し、円形の依存関係を作成するときにマルチスレッドプログラムで発生します。
たとえば、スレッドAはロック1を保持し、ロック2を待ちますが、スレッドBはロック2を保持し、ロック1を待ちます。どちらも進むことができず、デッドロックになります。
デッドロックにつながる一般的な条件(4つの必要な条件として知られています)があります。
- 相互除外:少なくとも1つのリソースを非共有モードに保持する必要があります。
- ホールドアンド待機:別のリソースを待っている間、スレッドは1つのリソースを保持します。
- プリエンプションはありません:リソースをスレッドから強制的に取得することはできません。
- 円形の待機:スレッドのサイクルが存在し、それぞれが次のリソースが保持するリソースを待っています。
Javaのデッドロックを防ぐ方法
デッドロックを避けるために、4つの条件の少なくとも1つを破る必要があります。ここに実用的な戦略があります:
1.ネストされたロックを避けてください
スレッドに複数のロックを取得させないでください。避けられない場合は、すべてのスレッドが同じグローバル順序でロックを取得することを確認してください。
//悪い:さまざまな注文で取得したロック スレッド1:ロック(locka); lock(lockb); スレッド2:lock(lockb); lock(locka); //デッドロックのリスク //良い:常に同じ順序で取得します スレッド1:ロック(locka); lock(lockb); スレッド2:ロック(locka); lock(lockb); // 安全
2。ロックの取得にはタイムアウトを使用します
java.util.concurrent.locks.ReentrantLock
のタイムアウトでtryLock()
を使用して、不定の待機を避けます。
REENTRANTLOCK LOCK1 = new ReentrantLock(); REENTRANTLOCK LOCK2 = new ReentrantLock(); boolean acchied1 = lock1.trylock(1、timeunit.seconds); if(acchied1){ 試す { boolean acchied2 = lock2.trylock(1、timeunit.seconds); if(acchied2){ 試す { //仕事をします } ついに { lock2.unlock(); } } } ついに { lock1.unlock(); } }
これは、ロックが使用できない場合にあきらめることにより、「保留と待機」状態を破ります。
3. java.util.concurrentのスレッドセーフクラスを使用します
ロックを手動で管理する代わりに、 ConcurrentHashMap
、 BlockingQueue
、 ExecutorService
などの高レベルの並行性ユーティリティを使用します。これらは安全であり、デッドロックの可能性を減らすように設計されています。
4.検出と回復(高度)
それ自体は予防ではありませんが、スレッドの状態とロックグラフを監視してデッドロック検出を実装し、スレッドを中断または再起動してサイクルを壊すことができます。これは複雑であり、通常、予防を支持して回避されます。
5。ロックの使用を最小限に抑えるための設計
- 同期ブロックの範囲を削減します。
- 可能であれば不変のオブジェクトを使用してください。
- 必要な場合にのみ
synchronized
メソッドを好みます。 - 単純な操作には、
AtomicInteger
などのAtomic Classesを使用することを検討してください。
デッドロックの防止は、主に慎重な設計に関するものです。重要なのは、複数のロックの必要性をロックし、最小限に抑えるための一貫性です。最新の並行性ツールを使用すると、手動ロック管理の負担が軽減されます。
基本的に、リソースアクセスを慎重に計画することで、スレッドが無期限にお互いを待つことができる状況を避けてください。複雑ではありませんが、ペースの速い開発を見落とすのは簡単です。
以上がJavaのデッドロックとは何ですか?どうすればそれを防ぐことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

Java設計パターンは、一般的なソフトウェア設計の問題に対する再利用可能なソリューションです。 1. Singletonモードは、データベース接続のプーリングまたは構成管理に適したクラスのインスタンスが1つしかないことを保証します。 2。工場モードはオブジェクトの作成を分離し、支払い方法などのオブジェクトは工場のクラスを通じて生成されます。 3.オブザーバーモードは、天気の更新などのイベント駆動型システムに適した、自動的に依存オブジェクトを通知します。 4.ソート戦略などの戦略モードの動的スイッチングアルゴリズムにより、コードの柔軟性が向上します。これらのパターンは、コードの保守性とスケーラビリティを改善しますが、過剰使用を避ける必要があります。
![現在、NVIDIA GPUに接続されたディスプレイを使用していません[修正]](https://img.php.cn/upload/article/001/431/639/175553352135306.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
ifyousee "youarenotusing adisplayatchedtoannvidiagpu、" surseyourmonitoristuntedtothenvidiagpuport、configuredisissettingsintingsintingsintinginstingsintingduandcleaninstall、およびsettheprimarysodiscutodiscreteinbios/ueftereed

adeadlockinjavaoccurswhentwoorthoreThreadsareblockededforever、それぞれの方向に、通常はdueTococularwaitcausedistentlockdoringを使用します

useoptional.empty()、optional.of()、andoptional.ofnullable()tocleateoptionalinstancesは、null、ornull、orpossivally null.2.ceeckforvaluessafelyusingispresent()orpreferablesifppresent()directnullted()aboiddirectnullted()aboiddirestinect()ofoiddirestinect()ofoiddirefrestnullterisent()

The oilpaintfilterinphotoshopisgreedouturedutivesuredivedocumentmodeorlayertype

プロバイダーメカニズムを介してアルゴリズムを実装するMessaged Gigest、Cipher、Keygenerator、Securerandom、Signature、KeystoreなどのJCAコアコンポーネントを理解します。 2. SHA-256/SHA-512、AES(256ビットキー、GCMモード)、RSA(2048ビット以上)、Securerandomなどの強力なアルゴリズムとパラメーターを使用します。 3.ハードコーディングされたキーを避け、キーストアを使用してキーを管理し、PBKDF2などの安全に派生したパスワードを介してキーを生成します。 4. ECBモードを無効にし、GCMなどの認証暗号化モードを採用し、各暗号化に一意のランダムIVを使用し、時間内に明確な敏感なモードを使用します

micronautisidealforbuildingcloud-nativejavaapplicationsduetoitsoitsoitlowmemoryfootprint、faststartuptimes、およびcompile-rededependencyinjection、makingsuperiortotrocksworkslikespringbootformicroservices、contate、anderverlessenvironments.1.micronments

runtheapplicationorcommandministrator byright-clicking and "runasadministrator" toensureelevatedprivilegeSareSaregranted.2.CheckuseraccountControl(UAC)Settingsearching foruacing foruacing inthestartmenuandSettingtheSedEdeDededefaultLevel(second)
