Javaマルチスレッドデッドロックケース(コードケース)
デッドロックとは
- スレッドがAオブジェクトロックを保持してBオブジェクトロックを待機すると、別のスレッドがBオブジェクトロックを保持してAオブジェクトロックを待機し、デッドロックが発生します。
- スレッドは複数のオブジェクトのロックマークを同時に保持できます。スレッドがブロックされると、スレッドが既に所有しているロックマークが解放されず、デッドロックが発生する可能性もあります。
事例紹介:
寮に残っている靴が1足しかない場合は、この時点でシャオミンとシャオペンの両方が出て行きます。一方は左の靴を、もう一方は右の靴を手に入れますが、誰にも渡してはいけないので、ほとんど死に至ります。ロック現象のため、誰も外に出てはいけません。
package com.nxw.Thread.dieLock;
public class DieLock{
public static void main(String[] args) {
Runnable xiaoming = new Runnable() {
public void run() {
synchronized (Shoes.left){
System.out.println("小明拿到了左脚鞋子");
synchronized (Shoes.right){
System.out.println("小明拿到了右脚鞋子,他可以穿鞋子走人了。。。");
}
}
}
};
Runnable xiaopeng = new Runnable() {
public void run() {
synchronized (Shoes.right){
System.out.println("小朋拿到了右脚鞋子");
synchronized (Shoes.left){
System.out.println("小朋拿到了左脚鞋子,他可以穿鞋子走人了。。。");
}
}
}
};
Thread thread1 = new Thread(xiaoming,"小明");
Thread thread2 = new Thread(xiaopeng,"小朋");
thread1.start();
thread2.start();
}
}
class Shoes {
public static String left = "leftShoes";
public static String right = "rightShoes";
}
コードの投稿を容易にするために、それらはすべて1つのクラスに書き込まれます。
さらに数回実行すると、XiaoMingとXiaoPengがたまたま靴を掴んだときに、デッドロックが発生したことがわかります。
したがって、作業でマルチスレッドを操作するときは、デッドロックを回避するように注意する必要があります。