多线程“死锁”之“哲学家就餐”代码实现

死锁:就是两个或者两个以上的线程相互占用对方的需要的资源,而不进行释放,导致彼此都在等待对方释放资源,产生了无限制的等待的现象。

“哲学家就餐”的问题不在赘述,可以自行百度或者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拿到了一只筷子
主线程结束
 

结果分析:

虽然主线程结束了,但是由于两个线程相互等待对方释放资源,导致死锁。

你可能感兴趣的:(java多线程)