`
wjjxf
  • 浏览: 239874 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

哲学家问题除死锁-java解法

阅读更多
哲学家问题,java去除死锁的解法,琢磨了半天,要避免死锁就必须在得不到右边的筷子情况下放弃左边的筷子,如此才可!正所谓,退一步海阔天空。。。。
public class Zhexuejia {
	
	public static void main(String[] args) throws Exception{
		  new Zhexuejia().t();
	}
	public void t() throws Exception{
		Jia j1 = new Jia("哲学家1", x1, x2);
		Jia j2 = new Jia("哲学家2", x2, x3);
		Jia j3 = new Jia("哲学家3", x3, x4);
		Jia j4 = new Jia("哲学家4", x4, x5);
		Jia j5 = new Jia("哲学家5", x5, x1);
		j1.start();
		j2.start();
		j3.start();
		j4.start();
		j5.start();
		j1.join();
		j2.join();
		j3.join();
		j4.join();
		j5.join();
	}
	class Kuaizi{
		String name;
		public Kuaizi(String name){
			this.name = name;
		}
		boolean enable = true;
		public boolean pickup(Kuaizi r){
			synchronized (this) {
				int c = 0;
				while(!enable&&c<3){
					try {
						c++;
						this.wait(50);//先放出去自己让别人用
					} catch (InterruptedException e) { 
						e.printStackTrace();
					}
				}
				if(!enable){//尝试3次努力还是没有得到就放弃前面的r
					if(r != null)
						r.down();
					return false;
				}
				enable = false;
				return true;
			}
		}
		public void down(){
			synchronized (this) {
				enable = true;
				notifyAll();
			} 
		}
		public String toString(){
			return name;
		}
	} 
	private Kuaizi x1 =  new Kuaizi("x1"); 
	private Kuaizi x2 =  new Kuaizi("x2"); 
	private Kuaizi x3 =  new Kuaizi("x3"); 
	private Kuaizi x4 =  new Kuaizi("x4"); 
	private Kuaizi x5 =  new Kuaizi("x5"); 
	
	class Jia extends Thread{ 
		Kuaizi lX, rX;
		String name;
		public Jia(String name, Kuaizi lX, Kuaizi rX){
			this.name = name;
			this.lX = lX;
			this.rX = rX;
		}
		public void run(){ 
			int c = 100;			
			boolean rs;
			while(c-- > 0){
				try { 
					System.out.println(name + " 想吃饭");
					rs = lX.pickup(null);
//					synchronized (lX) {//先得到坐标的筷子
					if(rs){
						System.out.println(name + " 获得了 " + lX + "筷子,等待右边的...");
					}else{
						System.out.println(name + " 得不到"+lX+",悲催啊");
						continue;
					}
					rs = rX.pickup(lX);
//						synchronized (rX) {//再得到右边的筷子,如果得不到也不放弃左边的,容易死锁,想避免就必须在得不到的情况下放弃左边的筷子		
							if(rs){
								System.out.println(name + " 终于获得了 " + rX
										+ "筷子,开始吃饭...");
							}else{
								System.out.println(name + " 得不到"+rX+",放弃"+lX+",悲哀啊");
								continue;
							} 
//						}
						
						System.out.println(name + " 放弃 " + rX + "筷子");
						rX.down();
//					}
					System.out.println(name + " 放弃 " + lX + "筷子");
					lX.down();
				} catch (Exception e) { 
					e.printStackTrace();
				}
			}
		}
	}
}
分享到:
评论

相关推荐

    哲学家就餐(死锁与非死锁解法)(图形界面)

    在 windows 环境下,利用高级语言编程环境(限定为 VS 环境或 VC 环境或QT)调用 CreateThread 函数哲学家就餐问题的演示。要求:(1)提供死锁的解法和非死锁的解法;(2)有图形界面直观显示哲学家取筷子,吃饭,...

    哲学家进餐问题死锁的造成.cpp

    死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而...先写一个会造成死锁的哲学家问题。当所有哲学家同时决定进餐,拿起左边筷子时候,就发生了死锁。

    有关于哲学家进餐死锁问题及预防的课程设计报告

    ### 哲学家进餐死锁问题及预防的课程设计报告知识点详解 #### 一、研究目的与意义 - **目的**: 通过模拟计算机操作系统中经典的“哲学家就餐问题”,帮助学生巩固操作系统原理课程中学到的知识,特别是关于进程...

    哲学家算法-java

    哲学家算法,也被称为Dining Philosophers Problem,是计算机科学中的一个经典问题,它由艾兹格·迪科斯彻在1965年提出,用于揭示并发控制和死锁现象。在这个问题中,五位哲学家围坐在一张桌子旁,每人面前都有一根...

    java哲学家就餐问题

    Java哲学家就餐问题是一个经典的多线程同步问题,源自计算机科学家Dijkstra提出的一个思想实验。在该问题中,五个哲学家围坐在一张圆桌旁,每人面前有一根筷子。他们交替进行思考和吃饭,但必须拿到左右两边的两根...

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    为了解析这个问题,我们需要深入理解Oracle数据库的锁定机制、死锁的原因以及如何诊断和解决死锁。 首先,Oracle数据库使用多粒度锁定(Multigranularity Locking,MGL)机制,提供行级、块级和表级的锁定。当事务...

    哲学家就餐问题与死锁问题

    操作系统死锁问题 C语言实现 有详细代码 都能实现

    哲学家就餐问题与死锁

    哲学家就餐问题是一个经典的计算机科学中的并发控制问题,它用于说明死锁的产生及解决策略。死锁是指多个进程在互相等待对方释放资源而形成的僵局,无法继续执行。在这个问题中,五个哲学家坐在一张圆桌旁,每个人...

    哲学家进餐问题,java实现

    哲学家进餐问题(Dining Philosophers Problem)是计算机科学中的一个经典同步问题,由艾兹格·迪科斯彻提出,旨在探讨并发系统中资源竞争与死锁的问题。在这个问题中,五个哲学家围坐在一张圆桌旁,每个人面前都有...

    mfc哲学家就餐问题

    - 问题定义:明确哲学家就餐问题的基本规则,包括每个哲学家的动作(拿起或放下筷子)以及可能产生的死锁状态。 - 算法分析:常见的解决方案包括银行家算法、随机选择哲学家或者使用信号量机制。例如,可以使用...

    哲学家就餐问题源程序

    问题的核心在于如何避免哲学家们陷入死锁,即所有哲学家都因为无法同时获得所需的两支筷子而无法进食。 在这个问题中,每个哲学家代表一个线程,每支筷子则是一个临界资源。当一个哲学家想吃饭时,他需要拿起左边和...

    不死锁的哲学家问题实现 java

    在Java中,我们可以使用信号量(Semaphore)来解决不死锁的哲学家问题。信号量是一种同步原语,用于控制对共享资源的访问。在本实现中,我们将创建两个类型的信号量:一个用于表示筷子,另一个用于控制哲学家可以...

    JAVA实现哲学家就餐问题

    ### JAVA实现哲学家就餐问题详解 #### 背景与问题描述 哲学家就餐问题是一个经典的并发编程问题,由Edsger Dijkstra提出,用于演示死锁、饥饿、竞态条件等多线程同步问题。场景设定为五位哲学家围坐在圆桌旁,桌上...

    信号量同步实验报告(哲学家进餐问题避免死锁的三种方法)

    操作系统初学,关于信号量同步的实验报告,用三种方法避免哲学家进餐问题死锁,a:and信号量,b:控制进餐人数,c设置条件

    操作系统 实验报告(含代码) 死锁和饥饿2 哲学家就餐问题

    本实验主要针对操作系统中的“死锁”与“饥饿”问题展开研究,通过经典案例——哲学家就餐问题,加深对这两种资源分配问题的理解及解决策略。 #### 实验目标 1. **理解死锁与饥饿现象的产生原因**:死锁是指多个...

    ucos-3实现哲学家就餐问题

    用最新的ucos-3来实现哲学家就餐的问题。5个哲学家围坐在桌子周围,实现哲学家的有序就餐,并避免死锁

    JAVA哲学家就餐问题

    "JAVA哲学家就餐问题"是计算机科学中一个经典的多线程同步问题,源自于Dijkstra提出的哲学家就餐的思考实验。在这个问题中,有五个哲学家围坐在一张圆桌旁,每人面前有一根筷子。当哲学家饿了时,他们需要拿起左右...

    哲学家就餐---MFC演示程序

    《哲学家就餐问题》是计算机科学中的一个经典多线程问题,源于数学家及哲学家图灵奖得主Dijkstra提出的假设情景。该问题旨在模拟五个哲学家在餐桌旁用餐的情景,他们每人有一只筷子,需要同时拿起左右两边的筷子才能...

    JAVA管程解决哲学家问题

    哲学家问题(Dining Philosophers Problem)是计算机科学中的一个经典问题,用于演示并发控制中的死锁现象。在这个问题中,五个哲学家围坐在一张圆桌旁,每人一边有一根筷子。当哲学家想要吃饭时,他需要同时拿起...

Global site tag (gtag.js) - Google Analytics