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

本文通过哲学家就餐问题的代码实现,演示了两个线程如何因争夺资源而陷入死锁状态。模拟中,两个哲学家分别拿到一只筷子后,无法继续获取另一只筷子开始就餐,从而形成了典型的死锁现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

结果分析:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值