死锁是指两个线程分别持有着锁,并相互等待对方释放锁的现象,发生死锁的线程都无法再继续运行,程序也就失去了生存性
打个比方,假如Alice.Bobby一起去吃意大利面,但是盘子旁边只有一把勺子和一把叉子,但是如果是想吃意大利面,叉子和勺子缺一不可。
现在的情况下 仅有的一把勺子被Alice拿走了,但是另一把叉子被Bobby拿走了,于是…
-
Alice拿着勺子一直等待Bobby放下叉子
-
Bobby拿着叉子一直等待Alice放下勺子
看现在的情况 Alice和Bobby就这样面面相觑,谁也吃不了,像这样,多个线程僵持下去,无法运行的状态称之为死锁
下面介绍发生死锁的三个条件 -
多个对象也就相当于勺子和叉子
-
再持有着某个对象角色的锁的同时,还想获取其他对象的锁,就相当于握着勺子,还想拿到对方的叉子,或者是握着叉子又想着拿到对方的勺子
-
Object角色是对应的 相当于 “拿勺子->拿叉子"和"拿叉子->拿勺子” 这两种操作,也就是说勺子和叉子的二者不能有先后顺序
---------------------------------下面是代码的实现--------------------------
package com.ly.bean7;
/**
* 死锁
* @author mac
*
*/
public class Test implements Runnable{
public int flag=1;
static Object o1=new Object();//锁1
static Object o2=new Object();//锁2
public static void main(String[] args) {
Test td1=new Test();
Test td2=new Test();
td1.flag=1;
td2.flag=0;
//开始线程
Thread t1=new Thread(td1);
t1.setName("线程一************");
t1.start();
Thread t2=new Thread(td2);
t2.setName("线程二++++++++++++");
t2.start();
}
@Override
public void run() {
System.out.println("flag="+flag);
//表明是对象1
if(flag==1){
//锁定对象O1
synchronized (o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在执行操作");
//锁定对象o2
synchronized (o2) {
System.out.println("1");
}
}
}
if(flag==0){
synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"长在执行操作");
synchronized (o1) {
System.out.println("0");
}
}
}
}
}