デッドロック
- 同期されたコードブロックが同時に「3つ以上のオブジェクトのロック」を保持している場合、「デッドロック」の問題が発生する可能性があります
- デッドロック:複数のスレッドが互いのリソースを保持し、デッドロックを形成します
デッドロックの4つの条件
- 相互排除条件:リソースは一度に1つのプロセスでのみ使用できます
- 要求と保留の条件:リソースを要求することによってプロセスがブロックされると、取得したリソースを保持します
- 剥奪条件なし:プロセスが取得したリソースは、使い果たされる前に強制的に剥奪することはできません。
- 循環待機条件:複数のプロセス間で循環待機リソース関係が形成されます。
デッドロックに必要な4つの条件は、上記のとおりです。1つ以上のデッドロックを破壊する方法を見つければ、デッドロックを回避できます。
package com.thread;
public class DeadLock {
public static void main(String[] args) {
Makeup g1 = new Makeup(0,"灰姑娘");
Makeup g2 = new Makeup(1,"白雪公主");
new Thread(g1).start();
new Thread(g2).start();
}
}
// 口红
class Lipstick{
}
// 镜子
class Mirror{
}
class Makeup implements Runnable{
// 需要的资源只要一份,用static来保持只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choice; // 选择
String girlName; //使用化妆品的人
public Makeup(int choice, String girlName){
this.choice = choice;
this.girlName = girlName;
}
@Override
public void run() {
try {
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void makeup() throws InterruptedException {
if (choice==0){
synchronized (lipstick){ // 获得口红的锁
System.out.println(this.girlName + "获得口红的锁");
Thread.sleep(1000);
// synchronized (mirror){ // 一秒钟后想获得镜子的锁
// System.out.println(this.girlName + "获得镜子的锁");
// }
}
// 解决方法,将锁放入外面,通过释放上一个锁来获取下一个锁
synchronized (mirror){ // 一秒钟后想获得镜子的锁
System.out.println(this.girlName + "获得镜子的锁");
}
}else {
synchronized (mirror){ // 获得镜子的锁
System.out.println(this.girlName + "获得镜子的锁");
Thread.sleep(2000);
// synchronized (lipstick){ // 两秒钟后想获得口红的锁
// System.out.println(this.girlName + "获得口红的锁");
// }
}
synchronized (lipstick){ // 两秒钟后想获得口红的锁
System.out.println(this.girlName + "获得口红的锁");
}
}
}
}