死锁的概念性
多个线程互相抱着对方需要的资源,形成僵持的局面
举个死锁的例子
package Thread;
//测试死锁
public class Lock {
}
class Lipstick {
}
class Mirror {
public static void main(String[] args) {
Makeup m = new Makeup(1,"mm");
Makeup n = new Makeup(0,"nn");
m.start();
n.start();
}
}
class Makeup extends Thread{
//使用static关键字使得口红和镜子只有一个
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int Choice;//两个选项 选项0,1 分别表示选镜子还是口红
String girlName;
Makeup(int choice,String girlName){
this.Choice = choice;
this.girlName = girlName;
}
@Override
public void run() {
make();
}
//根据选择来判断锁住的资源和一会儿去获取的资源
private void make(){
if(Choice==0){
synchronized (lipstick) {
System.out.println(girlName + "正在使用口红");
//这里的死锁块是使得lipstick在想要mirror的时候仍然处于锁定的状态
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mirror) {
System.out.println(girlName + "正在使用镜子");
}
}
}
else if(Choice==1){
synchronized (mirror) {
System.out.println(girlName + "正在使用镜子");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lipstick) {
System.out.println(girlName + "正在使用口红");
}
}
}
}
}
上述死锁的解决方案
private void make(){
if(Choice==0){
synchronized (lipstick) {
System.out.println(girlName + "正在使用口红");
}
//只有在使用的时候进行死锁,其他时间释放资源让另一个线程得以调用
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mirror) {
System.out.println(girlName + "正在使用镜子");
}
}
else if(Choice==1){
synchronized (mirror) {
System.out.println(girlName + "正在使用镜子");
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lipstick) {
System.out.println(girlName + "正在使用口红");
}
}
}
死锁的产生条件
死锁产生的必要条件有
1.资源只能够被一个线程所调用
2.线程想调用一个资源的时候,对另一个资源不放
3.线程不能够被抢夺
4.头尾相接的循环等待式无限死锁