コンセプト
デッドロックは、リソースの競争のために、実行プロセス内の2つ以上のプロセスを指し、お互いを待っての現象を引き起こす、彼らはダウンして進めることができなくなります外部の介入がない場合、リソースが十分であれば、リソースの要求のプロセスを満たすことができる、デッドロックの可能性は非常に低いですが、それ以外の場合は、リソースの限られた数の競争のためにされ、デッドロックに陥るでしょう。
デッドロックの理由
システム・リソースの不足
間違った順序で実行されるプロセス
リソースの不適切な割り当て
デッドロックの発生に必要な4つの条件
相互に排他的
解決策:相互に排他的な共有リソースを、同時にアクセスできるようにカプセル化します。
占有と待機
解決策: プロセスがリソースを要求するとき、他のリソースを占有しないこと、つまりすべてのリソースを一度に要求することが要求されます。
ノンプリエンプティブ
解決策:プロセスがリソースをすぐに割り当てられない場合、他のリソースを占有しないことが要求されます。
巡回待ち
解決策:リソースをソートし、プロセスに対して順番にリソースを要求します。
、デッドロックコード
public class DeadLock {
public static void main(String[] args) {
Resource666 res1 = new Resource666();
Resource666 res2 = new Resource666();
res1.flag = true;
res2.flag = false;
new Thread(new Runnable() {
@Override
public void run() {
res1.method();
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
res2.method();
}
},"B").start();
}
}
class Resource666 {
boolean flag = true;
private static final Object obj1 = new Object();
private static final Object obj2 = new Object();
public void method() {
if (flag) {
synchronized (obj1) {
System.out.println(Thread.currentThread().getName() + " " + "ロックを取得する1");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + " " + "ロックを取得する2");
}
}
} else {
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + " " + "ロックを取得する2");
synchronized (obj1) {
System.out.println(Thread.currentThread().getName() + " " + "ロックを取得する1");
}
}
}
}
}
、どのようにデッドロックのトラブルシューティング
デッドロックが発生したら、まず最初に jps コマンドを使って実行中のアプリケーションを表示します。
jstack 5116 # のクラスのjps出力である。pid
結果