JAVA—线程–死锁
1. 说明
一个线程锁住资源,另外一个线程也需要使用该资源,导致无法两个线程无法进行下去,形成僵持
2. 产生死锁的原因:
1>.互斥原因:一个资源只能被一个进程使用
2>.请求与保持条件:一个进程因为请求资源而阻塞,对已获得的资源保持不放
3>.不剥夺条件:简称已经获得资源,在未使用之前,不能强行剥夺
4>.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
3. 代码示例:
**代码实现业务:**两个女孩化妆,都需要使用镜子 和 口红,第一个女孩先使用镜子和口红,第二个女孩后使用口红和镜子,如果第一个女孩未用完口红,则第二个女孩则不能使用。
public class TestDeadLock {
public static void main(String[] args) {
MyLock girl1=new MyLock(0,"婉儿");
MyLock girl2=new MyLock(1,"蓉儿");
girl1.start();
girl2.start();
}
}
class Kouhong{
}
class Jingzi{
}
class MyLock extends Thread {
//需要的资源只有一份,用 static 保证只有一份
static Kouhong kouhong = new Kouhong();
static Jingzi jingzi = new Jingzi();
int choice;
String girlname;
//构造器,初始化方法
MyLock(int choice, String girlname) {
this.choice = choice;
this.girlname = girlname;
}
public MyLock(String name, int choice, String girlname) {
super(name);
this.choice = choice;
this.girlname = girlname;
}
@Override
public void run() {
try {
mylock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//化妆
private void mylock() throws InterruptedException {
if (choice == 0) {
synchronized (kouhong) {
System.out.println(this.girlname + "获得口红的锁");
Thread.sleep(1000);
/* //一个锁之内还有另外一个锁,导致资源不能释放
synchronized (jingzi) {System.out.println(this.girlname + "获得镜子的锁");
*/
}
//优化后的代码
synchronized (jingzi) {
System.out.println(this.girlname + "获得镜子的锁");
}
} else {
synchronized (jingzi) {
System.out.println(this.girlname + "获得镜子的锁");
Thread.sleep(2000);
/* 一个锁之内还有另外一个锁,导致资源不能释放
synchronized (kouhong) { System.out.println(this.girlname + "获得口红的锁");
*/
}
//优化后的代码
synchronized (kouhong) {
System.out.println(this.girlname + "获得口红的锁");
}
}
}
}