一、什么是死锁
两个线程,互相持有,占有对方想要的锁,不放手
仔细研究代码,自动释放锁是有条件的
会出现一种情况:boy想拿girl拿不到 Ban(绑匪)想拿money也拿不到,因为它们都还没有释放出来
这就叫做死锁,当然在代码当中这是有概率的
下面我们通过代码看看效果是怎么样的
首先new一个girl和money对象,必须得保证是同一个,所以不能直接在他们的类里面new,这样就不是同一个girl或者money了
我们在外面,然后通过构造器访问
二、总结
1、死锁是有概率的,有可能会引起死锁的代码并不是每次都会造成死锁
2、同步并不是说嵌套得越多越好
代码:
package com.atguigu.test13;
/*
* 死锁:
* 两个线程,互相持有,占有对方想要的锁,不放手。
*/
public class TestDeadLock {
public static void main(String[] args) {
Object g = new Object();
Object m = new Object();
Boy b = new Boy(g,m);
Bang bang = new Bang(g,m);
b.start();
bang.start();
}
}
//男朋友
class Boy extends Thread{
private Object girl;
private Object money;
public Boy(Object girl, Object money) {
super();
this.girl = girl;
this.money = money;
}
public void run(){
synchronized (money) {
System.out.println("你放了我女朋友,我给你500万");
synchronized (girl) {
System.out.println("给了对方500万");
}
}
}
}
//绑匪
class Bang extends Thread{
private Object girl;
private Object money;
public Bang(Object girl, Object money) {
super();
this.girl = girl;
this.money = money;
}
public void run(){
synchronized (girl) {
System.out.println("你给我500万,我放了你女朋友");
synchronized (money) {
System.out.println("放人");
}
}
}
}