讲一下线程的死锁,当多个线程抢占一个资源就会造成死锁
过多的同步可能会造成死锁
线程的死锁Java多线程:死锁 - 平凡希 - 博客园www.cnblogs.com
package cn.jd.syn;
/*
* 死锁:过多的同步可能造成相互不释放资源
* 从而相互等待,一般发生于同步中持有多个对象的锁
* 如何解决:不要在同一个代码块中,同时持有多个对象的锁
* 第二个锁在第一个锁里面才能造成死锁
*/
public class DeadLock {
public static void main(String[] args) {
Makeup g1 = new Makeup(1, "哈哈");
Makeup g2 = new Makeup(0, "呵呵");
g1.start();
g2.start();
}
}
//口红
class Lipstick {
}
//镜子
class Mirror {
}
//化妆
class Makeup extends Thread {
// 表示一面口红和一个镜子
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
// 选择
int choice;
// 名字
String girl;
public Makeup(int choice, String girl) {
this.choice = choice;
this.girl = girl;
}
@Override
public void run() {
// 化妆
makeup();
}
// 相互持有对方的对象锁-->可能造成死锁
private void makeup() {
if (choice == 0) {
synchronized (lipstick) {// 获得口红的锁
System.out.println(this.girl + "涂口红");
// 1秒后想拥有镜子的锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
synchronized (mirror) {
System.out.println(this.girl + "照镜子");
}
} else {
synchronized (mirror) {// 获得口红的锁
System.out.println(this.girl + "照镜子");
// 1秒后想拥有口红的锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
synchronized (lipstick) {
System.out.println(this.girl + "涂口红");
}
}
}
}https://www.zhihu.com/video/1233502156348964864