この記事では、Java 同時実行性の学習の内容を紹介します: デッドロックとは何ですか?デッドロックの紹介。困っている友人は参考にしていただければ幸いです。
デッドロックの概要:
Lock は、使い方が非常に簡単で理解しやすいため、多くの操作シナリオで使用できる非常に便利なツールです。しかし同時に、デッドロック問題などのトラブルも発生します。たとえば、2 つのスレッド A と B があり、どちらの実行にも 2 つのリソース a と b が必要です。 A がリソース a を取得し、B がリソース b を取得すると、A はリソース b を要求し、B はリソース a を要求します。この 2 つのスレッドは互いにブロックし、デッドロックが発生します。
コード例:
public calss DeadLockDemo{ private static String A = "A"; private static String B = "B"; public static void main(String[] args){ new DeadLockdemo().deadLock(); } private void deadLock(){ Thread t1 = new Thread(new Runnable(){ @Override public void run(){ synchronized(A){ try{ Thread.currentThread().sleep(2000); }catch(Exception e){ e.printStackTrace(); } synchronized(B){ System.out.println("B"); } } } }); Thread t2 = new Thread(new Runnable(){ @Override public void run(){ synchronized(B){ try{ Thread.currentThread().sleep(2000); }catch(Exception e){ e.printStackTrace(); } synchronized(A){ System.out.println("A"); } } } }); t1.start(); t2.start(); } }
上記のコードを実行するとデッドロックが発生し、t1 と t2 が相互にブロックします。
デッドロックのシナリオ分析:
より複雑なシナリオでは、t1 がロックを取得した後、何らかの異常な状態によりロック (無限) が解放されないために、このような問題が発生する可能性があります。ループ)。または、t1 がデータベース ロックを取得し、ロックを解放するときに例外がスローされましたが、解放されませんでした。
デッドロックを回避するいくつかの方法:
1. スレッドが同時に複数のロックを取得しないようにしてください。
2. 1 つのスレッドが同時に複数のサポートを占有することを避け、同時に 1 つのリソースのみを占有するようにしてください。
3. タイムロックを使用してみてください。 Lock.tryLock(timeout) は、代わりに内部ロック メカニズムを使用します。
4. データベースのロックの場合、ロックとロック解除はデータベース接続で実行する必要があります。
以上がJava 同時実行学習におけるデッドロックとは何ですか?デッドロックの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。