信号量哲学家问题java_利用AND信号量机制解决哲学家进餐问题
哲学家就餐问题是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信号量机制解决哲学家进餐问题相关推荐
- java 第六次实验_操作系统第六次实验报告——使用信号量解决哲学家进餐问题...
0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 通过编程进一步了解信号量. 2 实验内容 在服务器上用Vim编写一个程序:使用信号量解决任一个经典PV问题,测试给出结果,并 ...
- linux 信号量锁 内核,Linux内核中锁机制之信号量、读写信号量
在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...
- VxWorks中信号量实现任务间通信与同步机制分析
引 言 多任务内核.任务调度机制.任务间通信和中断处理机制,这些都是VxWorks运行环境的核心.多任务处理和任务间通信是实时操作系统的基石.一个多任务环境允许将一个实时应用构造成一套独立任务的集合, ...
- 用信号量实现进程互斥示例和解决哲学家就餐问题
用信号量实现进程互斥示例和解决哲学家就餐问题 参考文章: (1)用信号量实现进程互斥示例和解决哲学家就餐问题 (2)https://www.cnblogs.com/alantu2018/p/84731 ...
- python解决哲学家就餐问题(and型信号量)
最近操作系统刚学完这部分内容,老师要求下去自己实践一下,在网上看了看发现用python解决该问题的博文很少,而且好多都是错的,于是就自己写了一段代码 # and型信号量解决哲学家就餐问题 import ...
- 使用信号量机制解决生产者消费者问题
生产者消费者问题是经典的同步问题,这篇文章用来记录一下如何使用信号量机制解决. 信号量机制(Semaphore)是解决同步问题常用解法,所谓信号量其实就代表着对应共享资源的数量.对于信号量只允许三种操 ...
- 操作系统 之 「信号量机制解决进程同步问题」
文章目录 经典的信号量同步问题 第一部分 生产者消费者问题 1.多生产者多消费者 -- 吃水果 2.单生产者多消费者问题 -- 吸烟者 分析 3.多生产者问题 -- 仓库存货物 分析 解答 4.多生产 ...
- 信号量集(主要是AND信号量)
信号量集 当利用信号量机制解决了单个资源的互斥访问后,我们讨论如何控制同时需要多个资源的互斥访问.信号量集是指同时需要多个资源时的信号量操作. (1)AND型信号量集 AND型信号量集是指同时需 ...
- 二进制信号量,互斥信号和计数信号量的区别
VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信.同步和互斥的最优选择,提供任务间最快速的通信.也是提供任务间同步和互斥的主要手段.VxWorks提供3种信号量来解决不同的问题. ...
最新文章
- 内部类调用相同属性同名时的调用细节
- NOIP 2018 流水账
- file是c语言自带的数据类型吗_C语言中基本的数据类型包括
- mysql文档批处理去重_数据导入经验总结
- 数据采集录入填报时如何只更新当前修改行
- how is Java Bean object created
- Eclipse之文件【默认编码格式设置】,防止乱码等问题
- 这个大学生开发者用技术解决收入问题,乡亲们都回村了
- 交叉火力dsp手机调音软件_dsp教程_交叉火力dsp调音教程_教你学dsp百度云(2)
- 计算机哪些方向发展前景,计算机就业的几个方向
- 计算机数字音乐我的梦,我的音乐梦
- 做快乐的程序员 - 李战 在淘宝网的一次讲座
- 客制化机械键盘改键软件VIA介绍
- 数字孪生城市智能感知(持续更新)
- cocos creator游戏发布和部署-HTML5篇
- Linux学习日记15——exec函数族、回收子进程
- Gaussdb,国产数据库的崛起
- VBA语言入门:一些简单语法在Excel应用实例
- Heap和Heapify
- Python matplotlib绘图如何显示中文的问题【有报错没有解决】