程序比人笨多了,死锁就是两个线程在抢对方的资源,但是都不愿意先放手自己的资源,而人就会一手交钱一手交货,多好的
来看看死锁产生的条件:
1.互斥: 一个资源每次只能被一个进程用
2.请求保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放
3.不剥夺: 进程已获得资源,在未使用完之前,不能强行剥夺
4.循环等待:若干进程之间形成一种头尾相接的循环等待资源关系
这四个条件,只要有一个打破了,就可以避免死锁发生
来看看死锁是什么样的
//死锁:多个线程互相抱着对方要的资源,形成僵持
public class DeadLock {
public static void main(String[] args) {
Makeup g1 = new Makeup(0,"小红");
Makeup g2 = new Makeup(1,"小白");
g1.start();
g2.start();
}
}
//口红,一个对象
class Lipstick{
}
//镜子,另一个对象,这就是被两人争夺的资源
class Mirror{
}
//化妆
class Makeup extends Thread{
//只有一份资源,用static来保证只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choice;
String girlName;//使用化妆品的人
Makeup(int choice, String girlName){
this.choice = choice;
this.girlName = girlName;
}
@Override
public void run() {
//化妆
try {
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//化妆,互相持有对方的锁,就是拿到对方的资源
private void makeup() throws InterruptedException {
if (choice == 0){
synchronized (lipstick){
//获得口红的锁
System.out.println(this.girlName+"获得口红的锁");
Thread.sleep(1000);
synchronized (mirror){//这个同步锁存在于另一个同步锁内部,就导致了死锁的可能发生
//一秒钟后想获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁");
}
}
}else {
synchronized (mirror){
System.out.println(this.girlName+"获得镜子的锁");
Thread.sleep(2000);
synchronized (lipstick){
System.out.println(this.girlName+"获得口红的锁");
}
}
}
}
}
其中分别有口红和镜子两个对象,还有两个女孩,他们互相争夺资源,最下面的代码中有两个互相包含的同步块,这就导致了死锁的发生
这两人都抱着一个东西等另一个东西
我们对此解决的办法就是,让他们一手交钱一手交货,别抱着不放,我们对同步锁的那一块进行修改
//死锁:多个线程互相抱着对方要的资源,形成僵持
public class DeadLock {
public static void main(String[] args) {
Makeup g1 = new Makeup(0,"小红");
Makeup g2 = new Makeup(1,"小白");
g1.start();
g2.start();
}
}
//口红,一个对象
class Lipstick{
}
//镜子,另一个对象,这就是被两人争夺的资源
class Mirror{
}
//化妆
class Makeup extends Thread{
//只有一份资源,用static来保证只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choice;
String girlName;//使用化妆品的人
Makeup(int choice, String girlName){
this.choice = choice;
this.girlName = girlName;
}
@Override
public void run() {
//化妆
try {
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//化妆,互相持有对方的锁,就是拿到对方的资源
private void makeup() throws InterruptedException {
if (choice == 0){
synchronized (lipstick){
//获得口红的锁
System.out.println(this.girlName+"获得口红的锁");
Thread.sleep(1000);
}
synchronized (mirror){//这个同步锁存在于另一个同步锁内部,就导致了死锁的可能发生
//一秒钟后想获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁");
}
}else {
synchronized (mirror){
System.out.println(this.girlName+"获得镜子的锁");
Thread.sleep(2000);
}
synchronized (lipstick){
System.out.println(this.girlName+"获得口红的锁");
}
}
}
}
我们只改了同步块的位置,其他都没有变,来看看这俩姑娘还轴不轴
嗯,不错不错,两人都看开了。