我们来模拟一个死锁的案例
现在有张三想要李四的画,李四想要张三的书。
张三对李四说了:“你给我画,我就把书给你”。
李四也对张三说了:“你给我书,我就把画给你”。
此时,张三在等着李四的答复,而李四也在等着张三的答复,那么这样下去的最终结果就是张三得不到李四的画,李四也得不到张三的书。这实际上就是死锁的概念。
张三类
package com.thread;
/**
* @author 邓亚非
*/
public class ZhanSan {
/**
* 张三问李思要画
*/
public void say(){
System.out.println("张三对李思说:你把画给我,我就把书给你");
}
/**
* 张三得到李思的画
*/
public void get(){
System.out.println("张三得到了李思的画");
}
}
李思类
package com.thread;
/**
* @author 邓亚非
*/
public class LiSi {
/**
* 李思问张三要书
*/
public void say(){
System.out.println("李四对张三说,你把书给我,我就把画给你");
}
/**
* 李思得到张三得书
*/
public void get(){
System.out.println("李思得到了张三的书");
}
}
书画类线程体类
package com.thread;
/**
* @author 邓亚非
*/
public class BookHua extends Thread {
private static ZhanSan zhanSan=new ZhanSan();
private static LiSi liSi =new LiSi();
public boolean flag=false;
@Override
public void run() {
// true张三先说
if (flag){
synchronized (zhanSan) {
zhanSan.say();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (liSi) {
zhanSan.get();
}
}
}else {
// 李思开口
synchronized (liSi){
liSi.say();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (zhanSan){
liSi.get();
}
}
}
}
}