ホームページ  >  記事  >  Java  >  Java 同時実行学習におけるデッドロックとは何ですか?デッドロックの概要

Java 同時実行学習におけるデッドロックとは何ですか?デッドロックの概要

青灯夜游
青灯夜游転載
2018-10-22 17:48:132598ブラウズ

この記事では、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 サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。