デッドロック
- 複数のスレッドがそれぞれいくつかの共有リソースを占有し、他のスレッドが占有するリソースが実行されるのを待ちます。その結果、2つ以上のスレッドが互いにリソースを解放し、すべてが実行を停止するのを待ちます。特定の同期ブロックには、「2つの上記のオブジェクトがロックされると、「デッドロック」の問題が発生する可能性があります。
デッドロック回避方法
- デッドロックに必要な4つの条件:
- 相互に排他的な条件:リソースは、一度に1つのプロセスでのみ使用できます。
- 要求と保留の条件:リソースを要求することによってプロセスがブロックされると、プロセスは取得したリソースを保持し続けます。
- 非剥奪条件:プロセスによってすでに取得されたリソースは、使い果たされる前に強制的に剥奪することはできません。
- 循環待機条件:複数のプロセス間で一種の循環待機リソース関係が形成されます。
以上列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多个条件就可以避免死锁的发生
場合
package Thread;
//死锁 :多个线程互相拿着对方所需要的资源,然后形成僵持
public class DeadLock {
public static void main(String[] args) {
Makeop makeup = new Makeop(0,"妹妹");
Makeop makeup1 = new Makeop(1,"姐姐");
makeup.start();
makeup1.start();
}
}
//口红
class Liostick{
}
//镜子
class Mirrir{
}
class Makeop extends Thread {
//需要的资源只有一份,用static来保证只有一份
static Liostick lt = new Liostick();
static Mirrir mr = new Mirrir();
//选择
int choice;
//使用化妆品的人
String girlName;
Makeop(int choice, String girlName) {
this.choice = choice;
this.girlName = girlName;
}
public void run() {
//化妆
try {
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void makeup() throws InterruptedException {
if (choice == 0) {
//获得口红的锁
synchronized (lt) {
System.out.println(this.getName() + "获得口红的锁");
// 1s 之后获得镜子
Thread.sleep(1000);
//获得镜子的锁
synchronized (mr) {
System.out.println(this.getName() + "获得镜子的锁");
}
}
} else {
//获得镜子的锁
synchronized (mr) {
System.out.println(this.getName() + "获得镜子的锁");
// 1s 之后获得口红
Thread.sleep(1000);
//获得口红的锁
synchronized (lt) {
System.out.println(this.getName() + "获得口红的锁");
}
}
}
}
}
変更されたケース:ロックを別のロックの外側に置く
package Thread;
//死锁 :多个线程互相拿着对方所需要的资源,然后形成僵持
public class DeadLock {
public static void main(String[] args) {
Makeop makeup = new Makeop(0,"妹妹");
Makeop makeup1 = new Makeop(1,"姐姐");
makeup.start();
makeup1.start();
}
}
//口红
class Liostick{
}
//镜子
class Mirrir{
}
class Makeop extends Thread {
//需要的资源只有一份,用static来保证只有一份
static Liostick lt = new Liostick();
static Mirrir mr = new Mirrir();
//选择
int choice;
//使用化妆品的人
String girlName;
Makeop(int choice, String girlName) {
this.choice = choice;
this.girlName = girlName;
}
public void run() {
//化妆
try {
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void makeup() throws InterruptedException {
if (choice == 0) {
//获得口红的锁
synchronized (lt) {
System.out.println(this.getName() + "获得口红的锁");
// 1s 之后获得镜子
Thread.sleep(1000);
}
//获得镜子的锁
synchronized (mr) {
System.out.println(this.getName() + "获得镜子的锁");
}
} else {
//获得镜子的锁
synchronized (mr) {
System.out.println(this.getName() + "获得镜子的锁");
// 1s 之后获得口红
Thread.sleep(2000);
}
//获得口红的锁
synchronized (lt) {
System.out.println(this.getName() + "获得口红的锁");
}
}
}
}