产生死锁的四个必要条件
1 互斥条件:一个资源每次只能被一个进程使用
2 请求与保持条件:一个进程因请求资源而阻塞时,对已经获得的资源不放
3 不剥夺条件:进程已获得的资源,在未使用之前,不能强行剥夺
4 循环等待条件:若干之间形成一种头尾相接的循环等待资源关系
死锁产生的条件
产生死锁的四个必要条件
1 互斥条件:一个资源每次只能被一个进程使用
2 请求与保持条件:一个进程因请求资源而阻塞时,对已经获得的资源不放
3 不剥夺条件:进程已获得的资源,在未使用之前,不能强行剥夺
4 循环等待条件:若干之间形成一种头尾相接的循环等待资源关系
public class DwadLock {
public static void main(String[] args) {
Makeup girl1 = new Makeup(0,"小红");
Makeup girl2 = new Makeup(1,"小青");
girl1.start();
girl2.start();
}
}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
//化妆
class Makeup extends Thread{
// static保证资源只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choise;//选择
String girlName;//使用化妆品的人
Makeup(int choise,String girlName){
this.choise = choise;
this.girlName = girlName;
}
@Override
public void run() {
//化妆
makeup();
}
// 化妆的方法,互相持有对方的锁,就是想拿到对方的资源
private void makeup(){
if (choise== 0){
synchronized (lipstick){//获得口红的锁
System.out.println(this.girlName+"获得口红的锁");
try {
Thread.sleep(1000);//休息1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mirror){//1秒钟后想获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁");
}
}
}else {
synchronized (mirror){//获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁");
try {
Thread.sleep(2000);//休息1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lipstick){//2秒钟后想获得镜子的锁
System.out.println(this.girlName+"获得口红的锁");
}
}
}
}
}
解决方法
public class DwadLock {
public static void main(String[] args) {
Makeup girl1 = new Makeup(0,"小红");
Makeup girl2 = new Makeup(1,"小青");
girl1.start();
girl2.start();
}
}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
//化妆
class Makeup extends Thread{
// static保证资源只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choise;//选择
String girlName;//使用化妆品的人
Makeup(int choise,String girlName){
this.choise = choise;
this.girlName = girlName;
}
@Override
public void run() {
//化妆
makeup();
}
// 化妆的方法,互相持有对方的锁,就是想拿到对方的资源
private void makeup(){
if (choise== 0){
synchronized (lipstick){//获得口红的锁
System.out.println(this.girlName+"获得口红的锁");
try {
Thread.sleep(1000);//休息1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (mirror){//1秒钟后想获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁");
}
}else {
synchronized (mirror){//获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁");
try {
Thread.sleep(2000);//休息1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (lipstick){//2秒钟后想获得镜子的锁
System.out.println(this.girlName+"获得口红的锁");
}
}
}
}