哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题。

问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭。上述问题会产生死锁的情况,当5个哲学家都拿起自己右手边的筷子,准备拿左手边的筷子时产生死锁现象。

解决办法:

1、添加一个服务生,只有当经过服务生同意之后才能拿筷子,服务生负责避免死锁发生。

2、每个哲学家必须确定自己左右手的筷子都可用的时候,才能同时拿起两只筷子进餐,吃完之后同时放下两只筷子。

3、规定每个哲学家拿筷子时必须拿序号小的那只,这样最后一位未拿到筷子的哲学家只剩下序号大的那只筷子,不能拿起,剩下的这只筷子就可以被其他哲学家使用,避免了死锁。这种情况不能很好的利用资源。

参考:http://www.cnblogs.com/vettel/p/3438257.html

package操作系统;class Philosopher extendsThread {privateString name;privateFork fork;publicPhilosopher(String name, Fork fork) {super();this.name =name;this.fork =fork;

}

@Overridepublic voidrun() {

thinking();

fork.takeFork();

eating();

fork.putFork();

}voideating() {

System.out.println("I'm eating " +name);try{

sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}voidthinking() {

System.out.println("I'm thinking" +name);try{

sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}classFork {boolean[] used = { false, false, false, false, false};synchronized voidtakeFork() {

String threadName=Thread.currentThread().getName();

String name= threadName.substring(threadName.length()-1, threadName.length());int i =Integer.parseInt(name);while (used[i] || used[(i + 1) % 5]) {try{

wait();

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

used[i]= true;

used[(i+ 1) % 5] = true;

}synchronized voidputFork() {

String threadName=Thread.currentThread().getName();

String name= threadName.substring(threadName.length()-1, threadName.length());int i =Integer.parseInt(name);

used[i]= false;

used[(i+ 1) % 5] = false;

notifyAll();

}

}public class哲学家就餐问题 {public static voidmain(String[] args) {

Fork fork= newFork();new Philosopher("1", fork).start();new Philosopher("2", fork).start();;new Philosopher("3", fork).start();;new Philosopher("4", fork).start();;new Philosopher("5", fork).start();;

}

}

执行结果

I'm thinking1

I'm thinking3

I'm thinking2

I'm thinking4

I'm thinking5

I'm eating 1

I'm eating 3

I'm eating 5

I'm eating 2

I'm eating 4

信号量哲学家问题java_利用AND信号量机制解决哲学家进餐问题相关推荐

  1. java 第六次实验_操作系统第六次实验报告——使用信号量解决哲学家进餐问题...

    0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 通过编程进一步了解信号量. 2 实验内容 在服务器上用Vim编写一个程序:使用信号量解决任一个经典PV问题,测试给出结果,并 ...

  2. linux 信号量锁 内核,Linux内核中锁机制之信号量、读写信号量

    在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...

  3. VxWorks中信号量实现任务间通信与同步机制分析

    引 言 多任务内核.任务调度机制.任务间通信和中断处理机制,这些都是VxWorks运行环境的核心.多任务处理和任务间通信是实时操作系统的基石.一个多任务环境允许将一个实时应用构造成一套独立任务的集合, ...

  4. 用信号量实现进程互斥示例和解决哲学家就餐问题

    用信号量实现进程互斥示例和解决哲学家就餐问题 参考文章: (1)用信号量实现进程互斥示例和解决哲学家就餐问题 (2)https://www.cnblogs.com/alantu2018/p/84731 ...

  5. python解决哲学家就餐问题(and型信号量)

    最近操作系统刚学完这部分内容,老师要求下去自己实践一下,在网上看了看发现用python解决该问题的博文很少,而且好多都是错的,于是就自己写了一段代码 # and型信号量解决哲学家就餐问题 import ...

  6. 使用信号量机制解决生产者消费者问题

    生产者消费者问题是经典的同步问题,这篇文章用来记录一下如何使用信号量机制解决. 信号量机制(Semaphore)是解决同步问题常用解法,所谓信号量其实就代表着对应共享资源的数量.对于信号量只允许三种操 ...

  7. 操作系统 之 「信号量机制解决进程同步问题」

    文章目录 经典的信号量同步问题 第一部分 生产者消费者问题 1.多生产者多消费者 -- 吃水果 2.单生产者多消费者问题 -- 吸烟者 分析 3.多生产者问题 -- 仓库存货物 分析 解答 4.多生产 ...

  8. 信号量集(主要是AND信号量)

     信号量集 当利用信号量机制解决了单个资源的互斥访问后,我们讨论如何控制同时需要多个资源的互斥访问.信号量集是指同时需要多个资源时的信号量操作. (1)AND型信号量集 AND型信号量集是指同时需 ...

  9. 二进制信号量,互斥信号和计数信号量的区别

    VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信.同步和互斥的最优选择,提供任务间最快速的通信.也是提供任务间同步和互斥的主要手段.VxWorks提供3种信号量来解决不同的问题. ...

最新文章

  1. 内部类调用相同属性同名时的调用细节
  2. NOIP 2018 流水账
  3. file是c语言自带的数据类型吗_C语言中基本的数据类型包括
  4. mysql文档批处理去重_数据导入经验总结
  5. 数据采集录入填报时如何只更新当前修改行
  6. how is Java Bean object created
  7. Eclipse之文件【默认编码格式设置】,防止乱码等问题
  8. 这个大学生开发者用技术解决收入问题,乡亲们都回村了
  9. 交叉火力dsp手机调音软件_dsp教程_交叉火力dsp调音教程_教你学dsp百度云(2)
  10. 计算机哪些方向发展前景,计算机就业的几个方向
  11. 计算机数字音乐我的梦,我的音乐梦
  12. 做快乐的程序员 - 李战 在淘宝网的一次讲座
  13. 客制化机械键盘改键软件VIA介绍
  14. 数字孪生城市智能感知(持续更新)
  15. cocos creator游戏发布和部署-HTML5篇
  16. Linux学习日记15——exec函数族、回收子进程
  17. Gaussdb,国产数据库的崛起
  18. VBA语言入门:一些简单语法在Excel应用实例
  19. Heap和Heapify
  20. Python matplotlib绘图如何显示中文的问题【有报错没有解决】

热门文章

  1. PS画等分圆环的技巧
  2. 程序员健康指南--努力健康起来吧
  3. Android之ubuntu源码开发环境搭建笔记
  4. 【Python】 调用百度地图API抓取西安市小区信息
  5. ogre1.9环境搭建
  6. AbpVnext 微服务 内部网关服务通讯 动态API客户端
  7. 似然函数、最大似然函数理解
  8. 程序员必备的16个实用的网站
  9. 简单实用的ajax脚本
  10. 131-从键盘输入一个字符串,将其中的小写字母全部换成大写字母,然后输出到一个磁盘文件