题目分析并描述:

描述:

有五个哲学家,他们共用一张圆桌,分别坐在五张椅子上。在圆桌上有五支叉子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的叉子,只有在他拿到两支叉子时才能进餐,每个哲学家不能同时拿到两个叉子,进餐完毕,放下叉子又继续思考。

分析:

经分析可知,放在桌子上的叉子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对叉子的互斥使用,可以用一个信号量表示一只叉子,由这五个信号量组成信号量数组。当哲学家饥饿时总是先拿其左边的叉子,成功后,再去拿右边的叉子,又成功后方可就餐。进餐完,又先放下他左边的叉子,再放下右边叉子。这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。对于死锁问题可采取至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,最终总会释放出他所用过的两只叉子,从而可使更多的哲学家进餐的方法进行解决。

哲学家就餐问题程序代码:

package system;

import java.util.concurrent.Semaphore;

public class PhilosopherThread {

//一次只允许四个人抢叉子

static final Semaphore count = new Semaphore(4);

//五只叉子

static final Semaphore[] mutex = {new Semaphore(1),

new Semaphore(1),

new Semaphore(1),

new Semaphore(1),

new Semaphore(1)};

static class Philosopher extends Thread {

Philosopher(String name) {

super.setName(name);

}

@Override

public void run() {

do {

try {

//只有四个人有抢叉子的资格

count.acquire();

Integer i = Integer.parseInt(super.getName());

//规定都先拿左手边的叉子,于是四个人左手都有叉子

mutex[i].acquire();

//大家开始抢右边的叉子

mutex[(i + 1) % 5].acquire();

//谁先抢到谁第一个开吃

System.out.println("哲学家" + i + "号吃饭!");

//吃完放下左手的叉子,对于左边人来说,就是他的右叉子,直接开吃

mutex[i].release();

//再放下右手的叉子

mutex[(i + 1) % 5].release();

//吃完了,开始思考,由于放下了右手的叉子,相当于给一个叉子没有的哲学家一个左叉子

count.release();

//模拟延迟

Thread.sleep(2000);

} catch (InterruptedException e) {

System.out.println("异常");

}

} while (true);

}

public static void main(String[] args) {
        // TODO Auto-generated method stub
         //五个哲学家
        Philosopher p0 = new Philosopher("0");
        Philosopher p1 = new Philosopher("1");
        Philosopher p2 = new Philosopher("2");
        Philosopher p3 = new Philosopher("3");
        Philosopher p4 = new Philosopher("4");

p0.start();
        p1.start();
        p2.start();
        p3.start();
        p4.start();
    }
}

哲学家就餐问题PV原语相关推荐

  1. 哲学家就餐问题的三种避免死锁的解法(PV操作)

    哲学家就餐问题的三种避免死锁的解法(PV操作) 方案一:最多允许有四位哲学家同时去拿左边的筷子,然后再拿右边的筷子,最终保证至少有一位哲学家能够进餐,并在就餐完毕时同时释放他用过的两只筷子,从而使更多 ...

  2. 哲学家就餐问题实验报告

    哲学家就餐问题 两个地方应该是pv操作,pv都是操作元语,不可中断 p操作是将信号量-1 v操作是将信号量+1 pv一定要配对使用 哲学家进餐可以通过信号量机制解决,避免死锁 注释如下: test(i ...

  3. 哲学家进餐问题pv_【jMiniLang】哲学家就餐问题

    演示GIF(1.57MB),控制台输出效果(还有parser/vm/ui)自己实现: 信号量与PV原语 信号量为正数代表有空闲资源,为零与负数代表没有空闲资源.负数的绝对值代表等待的进程个数.信号量用 ...

  4. 进程间通信、死锁、信号量、PV原语

    文章目录 进程间通信(Inter-Process Communication, IPC) 顺序程序与并发程序的特征 进程互斥.临界资源.临界区 同步的细分 进程间通信目的 进程间通信发展 进程间通信分 ...

  5. 【操作系统/OS笔记14】经典同步问题:读者-写者问题、哲学家就餐问题

    本次笔记内容: 10.6 经典同步问题-1 10.7 经典同步问题-2 10.8 经典同步问题-3 10.9 经典同步问题-4 10.10 经典同步问题-5 10.11 经典同步问题-6 文章目录 读 ...

  6. 哲学家就餐问题(条件变量)

    1965年,著名计算机科学家艾兹格·迪科斯彻,提出并解决了一个他称之为哲学家就餐的同步问题. 从那时起,每个发明同步原语的人,都希望通过解决哲学家就餐问题来展示其同步原语的精妙之处. 这个问题可以简单 ...

  7. php 哲学家进餐,IPC问题-哲学家就餐(示例代码)

    如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃.哲学家在桌上只有思考(等待)和吃面(执行).看起来最多是只有2个人能同时吃. 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样都没法吃了 ...

  8. 哲学家就餐问题c语言_哲学家就餐问题的一种Python解决方案

    哲学家就餐问题一直是多线程同步问题的经典案例,本文中展示了多线程竞争共享资源带来的死锁问题,并介绍了一种简单的解决方案. 哲学家就餐问题 哲学家最擅长的就是思考和吃饭 ,当他们感觉累的时候,就会拿起一 ...

  9. 进程的同步、互斥以及PV原语

    在处理进程间的同步与互斥问题时,我们离不开信号量和PV原语,使用这两个工具的目的在于打造一段不可分割不可中断的程序.应当注意的是,信号量和PV原语是解决进程间同步与互斥问题的一种机制,但并不是唯一的机 ...

最新文章

  1. MySQL8.0索引新特性:颠覆了我对索引的认知
  2. iOS动画开发----打分 数字滚动刷新动画
  3. Spark-ML-数据获取/处理/准备
  4. OpenCV3计算机视觉+Python(五)
  5. net use 命令集合详解
  6. android listView的setOnScrollListener的使用
  7. html表单复选框样式,美化表单——自定义checkbox和radio样式
  8. 【机器学习】机器学习中的缺失值及其填充处理
  9. 【BZOJ1826】【tyvj2644】缓存交换,贪心+堆维护
  10. python简单例子lof_Python的净值数据接口调用示例分享
  11. 为什么某些地方结婚彩礼那么高呢?而广东却很低甚至不需要?
  12. Java面试题之 static执行顺序
  13. 【树叶识别】基于matlab HU不变矩树叶识别【含Matlab源码 797期】
  14. 两款不错的小软件推荐下载
  15. 投影仪与计算机连接方式,投影仪和电脑怎么连接?简单的图文教程
  16. IDEA社区版搭建web项目
  17. html中鼠标点击效果的制作,用CSS实现鼠标单击特效-网页设计,HTML/CSS
  18. Excel 如何引用某表格中的某一列作为数据有效性验证
  19. 手机浏览器 JavaScript 调起百度地图导航
  20. 《SpringBoot实战》读书笔记

热门文章

  1. phpEnv-专业优雅强大的php集成环境
  2. Windchill二次开发-自定义文件编号(2)
  3. 安川机器人外部急停信号点不开_不限 安川机器人示教器进不了系统各种故障维修...
  4. 关于重装WIN10后有NVIDIA驱动但没有控制面板的可能的解决办法
  5. unity3d控制物体移动
  6. 【1049】晶晶赴约会
  7. python面板数据模型操作步骤_任何有效的方法来建立面板数据的回归模型?
  8. 基于物体路标的仿人机器人实时里程计
  9. Python抓取网页并保存为PDF
  10. 痞子衡嵌入式:嵌入式里串口(UART)自动波特率识别程序设计与实现