哲学家就餐问题
筷子类
//筷子类 public class Chopstick { public String name; // 是否可用 boolean isAvailable; public Chopstick(String name) { this.name = name; isAvailable = true; } // 拿起筷子 public synchronized void takeChopstick() { while (!isAvailable) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } isAvailable = false; } //放下筷子 public synchronized void dropChopstick() { isAvailable = true; notify(); } }
哲学家类
public class Philosoper extends Thread{ // 哲学家名字 private String name; private Chopstick leftStick; private Chopstick rightStick; public Philosoper(String name, Chopstick leftStick, Chopstick rightStick) { this.name = name; this.leftStick = leftStick; this.rightStick = rightStick; } @Override public void run() { leftStick.takeChopstick(); System.out.println(name+"拿起了左边的筷子"+leftStick.name); rightStick.takeChopstick(); System.out.println(name+"拿起了右边的筷子"+rightStick.name); System.out.println("吃饭"); leftStick.dropChopstick(); rightStick.dropChopstick(); System.out.println("放下筷子"); } }
测试类
public static void main(String[] args) { // 定义三只筷子 Chopstick stick1 = new Chopstick("筷子1"); Chopstick stick2 = new Chopstick("筷子2"); Chopstick stick3 = new Chopstick("筷子3"); // 定义三个哲学家 Thread thread1 = new Philosoper("哲学家1", stick1, stick2); Thread thread2 = new Philosoper("哲学家2", stick2, stick3); Thread thread3 = new Philosoper("哲学家3", stick3, stick1); thread1.start(); thread2.start(); thread3.start(); }
结果
哲学家1拿起了左边的筷子筷子1 哲学家2拿起了左边的筷子筷子2 哲学家3拿起了右边的筷子筷子3
一直处于这个状态,每个人都没法用餐,都在等待对方放下筷子,这就是所谓的死锁。
解决死锁办法:
将其中的一个哲学家的左右筷子颠倒一下:
哲学家3把筷子1作为左边筷子,筷子3作为右边筷子,这样当哲学家先拿起筷子1时,发现已经被拿起,就等待,然后哲学家1就能拿起筷子3开始用餐,死锁解决。
解决方法:
public static void main(String[] args) { // 定义三只筷子 Chopstick stick1 = new Chopstick("筷子1"); Chopstick stick2 = new Chopstick("筷子2"); Chopstick stick3 = new Chopstick("筷子3"); // 定义三个哲学家 Thread thread1 = new Philosoper("哲学家1", stick1, stick2); Thread thread2 = new Philosoper("哲学家2", stick2, stick3); Thread thread3 = new Philosoper("哲学家3", stick1 stick3; thread1.start(); thread2.start(); thread3.start(); }
结果
哲学家1拿起了左边的筷子筷子1 哲学家2拿起了左边的筷子筷子2 哲学家2拿起了右边的筷子筷子3 吃饭 放下筷子 哲学家1拿起了右边的筷子筷子2 吃饭 放下筷子 哲学家3拿起了左边的筷子筷子1 哲学家3拿起了右边的筷子筷子3 吃饭 放下筷子
相关推荐
Java哲学家就餐问题是一个经典的多线程同步问题,源自计算机科学家Dijkstra提出的一个思想实验。在该问题中,五个哲学家围坐在一张圆桌旁,每人面前有一根筷子。他们交替进行思考和吃饭,但必须拿到左右两边的两根...
### c语言实现哲学家就餐问题 #### 实验背景与目的 **哲学家就餐问题**是计算机科学中的一个经典问题,通常用于演示并发控制中的死锁现象。这个问题涉及到五个哲学家和五个放在他们之间的筷子(或者叉子),每个...
《6个哲学家就餐问题原代码》 哲学家就餐问题是多线程编程中经典的一个死锁问题,它展示了并发操作中可能出现的资源竞争与死锁现象。在这个问题中,我们有6位哲学家围坐在一张圆桌旁,每位哲学家需要两支筷子才能...
哲学家进餐问题(Dining Philosophers Problem)是计算机科学中的一个经典同步问题,由艾兹格·迪杰斯特拉在1965年提出。它以五个正在进餐的哲学家为背景,每个哲学家都有两个习惯:思考和吃饭。在餐桌上有五根筷子...
哲学家就餐问题是一个经典的多线程同步问题,源自计算机科学中的并发控制理论。该问题由Edsger Dijkstra提出,用以模拟五个哲学家在餐桌上的就餐行为:他们每个人都有两只手,一只用来拿筷子(或刀叉),而餐桌上有...
分析哲学家进餐问题,p,v操作实现互斥与同步,分析记录性信号量的不足,并指出给改进方法 方法一:最多允许4人同时进餐; 方法二:分奇偶数进餐,以及AND型信号量解决该问题。 (免费下载,无需积分)
《哲学家进餐问题与C/C++多线程同步实践》 在计算机科学领域,多线程编程是一项关键技能,特别是在解决并发问题时。这里我们关注的是一个经典的并发问题——哲学家进餐问题(Dining Philosophers Problem)。该问题...
哲学家进餐问题
有三个.cpp文件,代码是我亲手写的,都可以运行,这个代码包含有3种方式避免死锁的方法,一个是允许四个哲学家同时进餐,第二个是一下子就拿两根筷子,否则不拿,第三个就是奇数哲学家先拿左边的筷子,偶数哲学家拿...
《C#实现哲学家就餐问题详解》 哲学家就餐问题是计算机科学中经典的多线程并发问题,由Edsger W. Dijkstra在1965年提出,旨在模拟多个哲学家在同一时间吃饭的情景,避免他们因筷子争夺而无法进食。在本案例中,我们...
操作系统初学,关于信号量同步的实验报告,用三种方法避免哲学家进餐问题死锁,a:and信号量,b:控制进餐人数,c设置条件
"哲学家进餐问题,操作系统" 哲学家进餐问题是计算机科学中的一种经典问题,它是由美国计算机科学家Edsger Dijkstra在1965年提出的。该问题模拟了五位哲学家围坐在圆桌旁,每人面前有一筷子,哲学家们需要拿起左右...
哲学家就餐问题是多线程编程中的一个经典示例,它由计算机科学家Edsger Dijkstra提出,用于模拟并发环境中可能出现的死锁问题。在该问题中,五个哲学家围坐在一张圆桌旁,每个人面前有一根筷子。当哲学家想要吃饭时...
µCOS-II 信号量试验——哲学家就餐问题 本实验报告旨在介绍µCOS-II操作系统下的信号量试验,通过经典的哲学家就餐问题实验,了解如何利用信号量来对共享资源进行互斥访问。 一、信号量概述 在µCOS-II操作系统...
### 哲学家就餐问题详解 #### 一、问题背景及定义 哲学家就餐问题是并发控制领域中的一个经典问题,最初由艾兹格·迪杰斯特拉(Edsger Dijkstra)提出。该问题通常用来阐述同步算法的概念,并且经常被用于测试各种...
操作系统中的“哲学家进餐问题”是一个经典的同步问题,它由计算机科学家Edsger Dijkstra在1965年提出,用于模拟并发进程的竞争条件。在这个问题中,五位哲学家围坐在一张圆桌旁,每人面前有一根筷子。他们交替地...