死锁:就是两个或者两个以上的线程相互占用对方的需要的资源,而不进行释放,导致彼此都在等待对方释放资源,产生了无限制的等待的现象。
“哲学家就餐”的问题不在赘述,可以自行百度或者Google,以下是代码。
package com.yarm.test;
/**
*
* @ClassName: DeadLock
* @Description: 死锁模拟
* @Company:小松鼠课堂
* @author yarm_杨松
* @date 2018年7月22日 上午11:55:39
*/
public class DeadLock extends Thread{
private Object tool;
//一双筷子,两个对象
static Object fork1 = new Object();
static Object fork2 = new Object();
//构造器
public DeadLock(Object obj){
this.tool = obj;
if (tool == fork1) {
this.setName("哲学家A");
}
if (tool == fork2) {
this.setName("哲学家B");
}
}
public void run(){
if (tool == fork1) {
synchronized (fork1) {
System.out.println("哲学家A拿到了一只筷子");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (fork2) {
System.out.println("哲学家A开始就餐");
}
}
}
if (tool == fork2) {
synchronized (fork2) {
System.out.println("哲学家B拿到了一只筷子");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (fork1) {
System.out.println("哲学家B开始就餐");
}
}
}
}
// 主函数
public static void main(String[] args) throws InterruptedException {
System.out.println("主线程启动");
DeadLock A = new DeadLock(fork1);
DeadLock B = new DeadLock(fork2);
A.start();
B.start();
Thread.sleep(500);
System.out.println("主线程结束");
}
}
控制台输出:
主线程启动
哲学家A拿到了一只筷子
哲学家B拿到了一只筷子
主线程结束
结果分析:
虽然主线程结束了,但是由于两个线程相互等待对方释放资源,导致死锁。