哲学家问题,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)有图形界面直观显示哲学家取筷子,吃饭,...
死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而...先写一个会造成死锁的哲学家问题。当所有哲学家同时决定进餐,拿起左边筷子时候,就发生了死锁。
### 哲学家进餐死锁问题及预防的课程设计报告知识点详解 #### 一、研究目的与意义 - **目的**: 通过模拟计算机操作系统中经典的“哲学家就餐问题”,帮助学生巩固操作系统原理课程中学到的知识,特别是关于进程...
哲学家算法,也被称为Dining Philosophers Problem,是计算机科学中的一个经典问题,它由艾兹格·迪科斯彻在1965年提出,用于揭示并发控制和死锁现象。在这个问题中,五位哲学家围坐在一张桌子旁,每人面前都有一根...
Java哲学家就餐问题是一个经典的多线程同步问题,源自计算机科学家Dijkstra提出的一个思想实验。在该问题中,五个哲学家围坐在一张圆桌旁,每人面前有一根筷子。他们交替进行思考和吃饭,但必须拿到左右两边的两根...
为了解析这个问题,我们需要深入理解Oracle数据库的锁定机制、死锁的原因以及如何诊断和解决死锁。 首先,Oracle数据库使用多粒度锁定(Multigranularity Locking,MGL)机制,提供行级、块级和表级的锁定。当事务...
操作系统死锁问题 C语言实现 有详细代码 都能实现
哲学家就餐问题是一个经典的计算机科学中的并发控制问题,它用于说明死锁的产生及解决策略。死锁是指多个进程在互相等待对方释放资源而形成的僵局,无法继续执行。在这个问题中,五个哲学家坐在一张圆桌旁,每个人...
哲学家进餐问题(Dining Philosophers Problem)是计算机科学中的一个经典同步问题,由艾兹格·迪科斯彻提出,旨在探讨并发系统中资源竞争与死锁的问题。在这个问题中,五个哲学家围坐在一张圆桌旁,每个人面前都有...
- 问题定义:明确哲学家就餐问题的基本规则,包括每个哲学家的动作(拿起或放下筷子)以及可能产生的死锁状态。 - 算法分析:常见的解决方案包括银行家算法、随机选择哲学家或者使用信号量机制。例如,可以使用...
问题的核心在于如何避免哲学家们陷入死锁,即所有哲学家都因为无法同时获得所需的两支筷子而无法进食。 在这个问题中,每个哲学家代表一个线程,每支筷子则是一个临界资源。当一个哲学家想吃饭时,他需要拿起左边和...
在Java中,我们可以使用信号量(Semaphore)来解决不死锁的哲学家问题。信号量是一种同步原语,用于控制对共享资源的访问。在本实现中,我们将创建两个类型的信号量:一个用于表示筷子,另一个用于控制哲学家可以...
### JAVA实现哲学家就餐问题详解 #### 背景与问题描述 哲学家就餐问题是一个经典的并发编程问题,由Edsger Dijkstra提出,用于演示死锁、饥饿、竞态条件等多线程同步问题。场景设定为五位哲学家围坐在圆桌旁,桌上...
操作系统初学,关于信号量同步的实验报告,用三种方法避免哲学家进餐问题死锁,a:and信号量,b:控制进餐人数,c设置条件
本实验主要针对操作系统中的“死锁”与“饥饿”问题展开研究,通过经典案例——哲学家就餐问题,加深对这两种资源分配问题的理解及解决策略。 #### 实验目标 1. **理解死锁与饥饿现象的产生原因**:死锁是指多个...
用最新的ucos-3来实现哲学家就餐的问题。5个哲学家围坐在桌子周围,实现哲学家的有序就餐,并避免死锁
"JAVA哲学家就餐问题"是计算机科学中一个经典的多线程同步问题,源自于Dijkstra提出的哲学家就餐的思考实验。在这个问题中,有五个哲学家围坐在一张圆桌旁,每人面前有一根筷子。当哲学家饿了时,他们需要拿起左右...
《哲学家就餐问题》是计算机科学中的一个经典多线程问题,源于数学家及哲学家图灵奖得主Dijkstra提出的假设情景。该问题旨在模拟五个哲学家在餐桌旁用餐的情景,他们每人有一只筷子,需要同时拿起左右两边的筷子才能...
哲学家问题(Dining Philosophers Problem)是计算机科学中的一个经典问题,用于演示并发控制中的死锁现象。在这个问题中,五个哲学家围坐在一张圆桌旁,每人一边有一根筷子。当哲学家想要吃饭时,他需要同时拿起...