Punto muerto
- Cada uno de los subprocesos ocupa algunos recursos compartidos y espera a que se ejecuten los recursos ocupados por otros subprocesos. Como resultado, dos o más subprocesos están esperando que el otro libere recursos y todos detengan la ejecución. Un cierto bloque de sincronización tiene tanto "dos El problema de "interbloqueo" puede ocurrir cuando los objetos anteriores están bloqueados.
Método de evitación de interbloqueo
- Cuatro condiciones necesarias para el interbloqueo:
- Condiciones mutuamente excluyentes: un recurso solo puede ser utilizado por un proceso a la vez.
- Condiciones de solicitud y retención: cuando un proceso se bloquea al solicitar recursos, sigue reteniendo los recursos adquiridos.
- Condiciones de no privación: Los recursos ya adquiridos por el proceso no pueden ser privados por la fuerza antes de que se agoten.
- Condición de espera de circulación: se forma una especie de relación de recurso de espera cíclica entre varios procesos.
以上列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多个条件就可以避免死锁的发生
Caso
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() + "获得口红的锁");
}
}
}
}
}
Caso modificado: coloque la cerradura fuera de otra cerradura
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() + "获得口红的锁");
}
}
}
}