造成死锁的原因:
两个线程同时互相持有各自的锁,就会造成死锁。例如下面的例子:张三首先镜子,照了镜子之后需要口红,而李四是首先口红,
涂完口红后需要照镜子。如果两个线程同时进来,张三拿到镜子,李四拿到口红,张三等待涂口红后这个synchronize的方法才能结束释放,李四需要照了镜子之后synchronize的方法结束释放口红,这样就形成张三等待李四的口红,李四等待张三的镜子,互相持着自己的锁没有释放,就形成了死锁。
避免死锁:
不要在同一个同步块,同时持有多个对象的锁。
/*
* 死锁:过多的同步可能会造成相互不释放资源
* 相互等待对方的资源,从而导致死锁
*
* 避免:不要在同一个同步块,同时持有多个对象的锁
*/
public class DeadLock {
public static void main(String[] args) {
Markup g1 = new Markup(0, "张三");
Markup g2 = new Markup(1, "李四");
g1.start();
g2.start();
}
}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
class Markup extends Thread{
static Lipstick lipstick =new Lipstick();
static Mirror mirror=new Mirror();
private Integer choose;
private String girl;
public Markup(Integer choose,String girl){
this.choose=choose;
this.girl=girl;
}
public void run(){
markup();
}
public void markup(){
if (choose==0){
synchronized (lipstick){
System.out.println(this.girl+"在涂口红");
//会形成死锁
// synchronized (mirror){
// System.out.println(this.girl+"在照镜子");
// }
}
synchronized (mirror){
System.out.println(this.girl+"在照镜子");
}
}else {
synchronized (mirror){
System.out.println(this.girl+"在照镜子");
//会形成死锁
// synchronized (lipstick){
// System.out.println(this.girl+"在涂口红");
// }
}
synchronized (lipstick){
System.out.println(this.girl+"在涂口红");
}
}
}
}