哲学家问题,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) 请求与保持条件:一个进程因请求资源而...先写一个会造成死锁的哲学家问题。当所有哲学家同时决定进餐,拿起左边筷子时候,就发生了死锁。
java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁...
操作系统死锁问题 C语言实现 有详细代码 都能实现
死锁是进程并发执行过程中可能出现的现象,哲学家就餐问题是描述死锁的经典例子。假设有几位哲学家围坐在一张餐桌旁,桌上有吃不尽的食品,每两位哲学家之间摆放着一根筷子,筷子的个数与哲学家的数量相等,每一位...
可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐。 3.3 解决方案(以下解决方案均可,实现一种) 3.3.1 最多允许4个哲学家同时坐在桌子周围。 3.3.2 给所有哲学家...
哲学家进餐问题的课程设计报告,包括课程设计背景,程序流图,源代码,分析,注解,以及课程设计总结。相当完整
有关表死锁的详细图片 博文链接:https://meteor-1988.iteye.com/blog/1568695
进程调度与死锁-作业 帮你复习所学的东西
用最新的ucos-3来实现哲学家就餐的问题。5个哲学家围坐在桌子周围,实现哲学家的有序就餐,并避免死锁
操作系统初学,关于信号量同步的实验报告,用三种方法避免哲学家进餐问题死锁,a:and信号量,b:控制进餐人数,c设置条件
死锁1deadlock---马克-to-win java视频的详细描述与介绍
死锁2deadlock---马克-to-win java视频的详细的描述与介绍
关于5个哲学家就餐线程同步问题的解决方法 此方法对左右手刀叉实行控制,防止了死锁,实现了线程的同步 注意5个以上的哲学家亦可用此方法解决
java解哲学家就餐问题 哲学家进餐问题是一个多线程运用的经典例子,涉及到线程同步/互斥,临界区访问问题以及一个避免死锁的解决方法。 有五个哲学家绕着圆桌坐,每个哲学家面前有一盘面,两人之间有一支筷子,...
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。 在圆桌上有五个碗和五把叉子,平时...哲学家进餐问题可看作是并发进程并发执行时处理共享资源的一个有代表性的问题。
用JAVA实现哲学家就餐问题,本源码中采用的是奇数号哲学家先拿左手后拿右手,而偶数号哲学家采用先拿右手后拿左手的策略来预防死锁。
哲学家就餐:Java多线程实例图形版 哲学家就餐是一个经典的Java多线程编程的实例,这是图形版。涉及到线程同步与互斥,临界区访问问题以及避免死锁的方法。 哲学家就餐:有五个哲学家绕着圆桌坐,每个哲学家...
哲学家就餐问题与死锁。该程序能演示哲学家死锁情况,也能演示采用死锁预防方法解除死锁的情况 (1)演示死锁现象; (2)通过资源预分配法防止死锁; (3)退出。