一. 问题描述
5个哲学家,5跟筷子,哲学家必须用两只筷子吃东西。他们只能使用自己左右手边的那两只筷子。做到不产生死锁以及要求高并发性。
二. 资源加锁法
直接给所请求的资源加锁,其他人想访问必须等待;
package psy;
/**
* 哲学家线程
* @author stephenluu
*
*/
public class PerThread extends Thread {
private static int[] chopstick = { 1, 1, 1, 1, 1 };
private int i;
public PerThread(int i) {
this.i = i;
}
@Override
public void run() {
synchronized (chopstick) { //若注释此行,打开下行,不同步,5个per只拿到左筷子
//{
eat(this.getName());
think(this.getName());
}
}
private void think(String name) {
chopstick[i] = 1;
chopstick[(i + 1) % 5] = 1;
System.out.println("per"+name+" is thinking...");
}
private void eat(String string) {
while (true) {
if (chopstick[i] != 0) {
chopstick[i]--;
System.out.println("per" + this.getName()
+ " got left chopstick.");
break;
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
if (chopstick[(i + 1) % 5] != 0) {
chopstick[(i + 1) % 5]--;
System.out.println("per" + this.getName()
+ " got right chopstick.");
break;
}
}
System.out.println("per" + string + " is eating...");
}
}
测试类
package psy;
/**
* 解决哲学家进餐问题
* @author stephenluu
*
*/
public class MainTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread t = new PerThread(i);
t.start();
}
}
}
效果:
perThread-0 got left chopstick.
perThread-0 got right chopstick.
perThread-0 is eating...
perThread-0 is thinking...
perThread-4 got left chopstick.
perThread-4 got right chopstick.
perThread-4 is eating...
perThread-4 is thinking...
perThread-3 got left chopstick.
perThread-3 got right chopstick.
perThread-3 is eating...
perThread-3 is thinking...
perThread-2 got left chopstick.
perThread-2 got right chopstick.
perThread-2 is eating...
perThread-2 is thinking...
perThread-1 got left chopstick.
perThread-1 got right chopstick.
perThread-1 is eating...
perThread-1 is thinking...
这样死锁就不会产生的了,但是会不会太浪费资源啊?! 还有效率也慢。
三.超时释放法
假设规定当哲学家等待另一只餐叉超过五分钟后就放下自己手里的那一只筷子,并且再等五分钟后进行下一次尝试。这个策略也消除了死锁。
package perEat;
/**
* 哲学家线程
* @author stephenluu
*
*/
public class PerThread extends Thread {
private static int[] chopstick = {1,1,1,1,1};
private int i;
private int n = 5;
public PerThread(int i) {
this.i = i;
}
@Override
public void run() {
//拿左筷子
synchronized (chopstick) {
while (chopstick[i] == 0) {
try {
chopstick.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
chopstick[i]--;
System.out.println("per" + this.getName()
+ " got left chopstick.");
chopstick.notify();
}
// 睡一下产生死锁
try {
Thread.sleep((long) (Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
//拿右筷子
synchronized (chopstick) {
while (chopstick[(i + 1) % n] == 0) {
try {
chopstick.wait(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
finally{
System.out.println(this.getName()+" waited 3s ,free left chopstick");
chopstick[i] ++;
}
}
chopstick[(i + 1) % n]--;
System.out.println("per" + this.getName()
+ " got right chopstick.");
System.out.println("per" + this.getName() + " is eating...");
chopstick[i]++;
chopstick[(i + 1) % n]++;
System.out.println("per"+this.getName()+" is thinking...");
chopstick.notify();
}
}
}
测试类
package perEat;
/**
* 解决哲学家进餐问题
* @author stephenluu
*
*/
public class MainTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread t = new PerThread(i);
t.start();
}
}
}
效果:
perThread-0 got left chopstick.
perThread-2 got left chopstick.
perThread-3 got left chopstick.
perThread-4 got left chopstick.
perThread-1 got left chopstick.
Thread-3 waited 3s ,free left chopstick
Thread-0 waited 3s ,free left chopstick
Thread-1 waited 3s ,free left chopstick
Thread-4 waited 3s ,free left chopstick
perThread-4 got right chopstick.
perThread-4 is eating...
perThread-4 is thinking...
Thread-2 waited 3s ,free left chopstick
perThread-2 got right chopstick.
perThread-2 is eating...
perThread-2 is thinking...
Thread-3 waited 3s ,free left chopstick
perThread-3 got right chopstick.
perThread-3 is eating...
perThread-3 is thinking...
Thread-0 waited 3s ,free left chopstick
perThread-0 got right chopstick.
perThread-0 is eating...
perThread-0 is thinking...
Thread-1 waited 3s ,free left chopstick
perThread-1 got right chopstick.
perThread-1 is eating...
perThread-1 is thinking...
并发性比第一种好。这个策略消除了死锁(系统总会进入到下一个状态),但仍然有可能发生“活锁”。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的筷子,那么这些哲学家就会等待五分钟,同时放下手中的筷子,再等五分钟,又同时拿起这些筷子。。。。。。
四.
最初是张龙说,5个哲学家都拿起左筷子,产生死锁,最后全部哲学家都饿死了! 觉得挺有趣,加上《操作系统》课程有提到,今天下午研究了一下,能力有限,只写出“资源加锁”和“超时释放”两种方法,至于百度百科的三种“正确”的解决方法:服务生解法,资源分级法,和Chandy/Misra解法,有机会在尝试下。
分享到:
相关推荐
Origin教程009所需练习数据
内容概要:本文提出了一个新的激活函数dReLU,用于提高大语言模型(LLM)的稀疏激活水平。dReLU可以显著减少模型推理过程中激活的参数数量,从而实现高效的模型推理。通过在Mistral-7B和Mixtral-47B模型上的实验,验证了dReLU的有效性。结果表明,使用dReLU的模型在性能上与原始模型相当甚至更好,同时减少了计算资源的需求,达到了2-5倍的推理加速。 适合人群:对深度学习、大语言模型和模型优化感兴趣的机器学习研究人员和技术开发者。 使用场景及目标:适用于需要高效推理的大语言模型应用场景,特别是资源受限的设备,如移动电话。目标是减少模型的计算资源消耗,提高推理速度。 其他说明:本文详细探讨了dReLU的设计和实验验证,提供了大量的实验数据和对比结果,展示了dReLU在多种任务上的优越表现。
最近参加一个农业机器人的比赛,由于今年的题目是蔬菜幼苗自动搬运,因此搬运部分需要用到一个三轴运动的装置,我们参考了3D打印机的原理,上面通过步进电机控制丝杆和皮带从而带动我们的抓手来抓举幼苗。因为比赛的幼苗和幼苗的基质比较小,这个过程需要精度比较高,查询了一些资料后,我想到了用dma来给STM32单片机的定时器寄存器ARR发送数据来精准控制输出pwm的数量,从而可以精准控制步进电机转动的度数,可以十分方便的计算出到某个位置需要的脉冲。
白色大气风格的商务团队公司模板下载.zip
2023-04-06-项目笔记-第三百五十八阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.356局变量的作用域_356- 2024-12-25
白色大气风格的个人摄影图片博客网站源码下载.zip
白色大气风格的木材加工行业网站模板下载.zip
PCle AI加速卡在智能制造中的应用.docx
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
白色风格的后台管理系统模板下载.rar
内容概要:本文详细介绍了网络热点采集系统的开发过程,包括网页抓取、数据去重、清洗、分类和可视化的各个环节。系统使用 Python 的 requests 和 BeautifulSoup 库抓取指定关键词相关的网页内容,通过集合数据结构去重,利用正则表达式清洗数据,根据关键词匹配进行分类,最后通过 matplotlib 和 wordcloud 库进行数据可视化,展示热点信息。此外,文章还介绍了多线程抓取、数据缓存、异常处理等性能优化方法,以及系统的部署和运行步骤。 适合人群:具有 Python 编程基础的开发人员和技术爱好者。 使用场景及目标:该系统适用于需要实时监控网络热点话题的个人或企业,帮助他们快速了解和分析热点信息的趋势和分布,辅助决策。 阅读建议:在学习本文时,建议读者跟随每一步代码实现,理解各个模块的设计思路和技术细节,并尝试在自己的环境中搭建和运行整个系统,以便更好地掌握网络热点采集系统的开发流程。
白色大气风格的KTV美女麦霸网站模板下载.zip
白色简洁风的博客网站模板下载.zip
梧州市五险一金办事指南
白色简洁风格的餐厅服务团队整站网站源码下载.zip
白色大气风格的境外游景区模板下载.zip
白色大气风格的美食厨师展示模板下载.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
白色大气风格的视察滚动房地产模板下载.zip
【要点】:本文提出LLM-Select方法,利用大型语言模型(LLM)在仅提供输入特征名称和预测任务描述的情况下,实现特征选择,其性能可媲美传统数据科学工具,并具有跨查询机制和提示策略的一致性。 【方法】:通过零样本提示(zero-shot prompt)LLM输出特征的重要性分数,实现特征选择。 【实验】:在真实世界数据集上进行广泛实验,结果表明基于LLM的特征选择在性能上与LASSO等数据驱动方法相当,且无需查看下游训练数据。