操作系统中的哲学家进餐问题的实现(java实现)

PV操作解决哲学家进餐问题(图文详解) 哲学家进餐问题(通俗易懂) 1、哲学家进餐问题描述 哲学家进餐问题说的是:有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,该哲学家进餐完毕后,放下左右两只筷子又继续思考。这个问题是由荷兰学者Dijkstra提出的经典的同步问题之一。哲学家进餐问题是一大类并发控制问题的典型例子,涉及信号量机制、管程机制以及死锁等操作系统中关键问题的应用,在操 阅读详情

在学习操作系统这本书的时候,我们使用的是汤小丹老师的《计算机操作系统》接下来我将会使用java语言去实现内部代码。

Swap指令

哲学家就餐问题是在计算机科学中的一个经典问题,用来演示在并行计算中多线程同步(Synchronization)时产生的问题。在1971年,著名的计算机科学家艾兹格·迪科斯彻提出了一个同步问题,即假设有五台计算机都试图访问五份共享的磁带驱动器。稍后,这个问题被托尼·霍尔重新表述为哲学家就餐问题。这个问题可以用来解释死锁和资源耗尽。

利用记录型信号量解决哲学家进餐问题,但是这样会这引起如结果所示的死锁问题。

package chapter02;

public class P69_1 {
    static int[] chopstick = {1,1,1,1,1};

    public static void main(String[] args) {
        InnerThread a0 = new InnerThread();
        a0.setName("0");
        a0.start();

        InnerThread a1 = new InnerThread();
        a1.setName("1");
        a1.start();

        InnerThread a2 = new InnerThread();
        a2.setName("2");
        a2.start();

        InnerThread a3 = new InnerThread();
        a3.setName("3");
        a3.start();

        InnerThread a4 = new InnerThread();
        a4.setName("4");
        a4.start();
    }

    static class InnerThread extends Thread{
        @Override
        public synchronized void run() {
            while (true){
                int index = Integer.parseInt(this.getName());
                if(chopstick[index]==1){
                    chopstick[index]=0;
                    System.out.println("哲学家"+this.getName()+"获得左筷子"+",筷子序号为"+index);
                }else{
                    //否则睡眠
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                if(chopstick[((index+1)%chopstick.length)]==1){
                    chopstick[((index+1)%chopstick.length)]=0;
                    System.out.println("哲学家"+this.getName()+"获得左筷子"+",筷子序号为"+(index+1)%chopstick.length);

                    System.out.println("哲学家"+this.getName()+"吃饭");
                    try {
                        Thread.sleep(1000);
                        //进行赋值
                        chopstick[index]=1;
                        chopstick[((index+1)%chopstick.length)]=1;
                        System.out.println("哲学家"+this.getName()+"思考");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else{
                    //否则睡眠
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

运行结果:

"C:\Program Files\Java\jdk1.8.0_101\bin\java.exe" 
哲学家0获得左筷子0序号为
哲学家3获得左筷子3序号为
哲学家1获得左筷子1序号为
哲学家2获得左筷子2序号为
哲学家4获得左筷子4序号为

Process finished with exit code -1

 

解决办法:

1.至多允许四位哲学家同时拿起筷子,最终能保证一位哲学家能够进食。

 

2.仅当左右筷子都可以使用的时候才允许拿起筷子

3.规定奇数哲学家先拿起左筷子,然后再拿右筷子,反之亦然。

java多线程--哲学家进餐问题(操作系统)(哲学家进餐问题:5个哲学家共用一张圆桌,分别坐在周围的5张椅子上,在圆桌上有5个碗和5只筷子(注意是5只筷子,不是5双),碗和筷子交替排列。) 哲学家进餐问题:5个哲学家共用一张圆桌,分别坐在周围的5张椅子上,在圆桌上有5个碗和5只筷子(注意是5只筷子,不是5双),碗和筷子交替排列。他们的生活方式是交替地进行思考(thinking)和进餐(eating)。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的两只筷子,规定他必须先取左边的筷子,再取右边的筷子。只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续进行思考。假如5位哲学家同时饥饿,各自拿起左边的筷子时,再去拿各自右边的筷子,因为无筷子可拿而陷入无期限等待(死锁)。一种解决的办法是 阅读详情

相关推荐

操作系统进程同步与互斥:信号量PV操作经典习题解析与避坑指南

信号量是操作系统中实现进程同步与互斥的核心机制,通过wait/signal原子操作管理共享资源。其原理基于整型计数与阻塞队列,确保临界区互斥访问和事件顺序协作。掌握信号量能有效解决生产者-消费者、读者-写者等经典并发问题,避免死锁与竞态条件。在工程实践中,POSIX信号量、Java Semaphore等API均源于此。本文从PV操作底层语义切入,拆解高频习题,提供参考答案与常见错误修正,助你彻底掌握进程同步互斥的解题套路。

weixin_32430941的博客 201

哲学家进餐问题

哲学家进餐问题描述: 哲学家进餐问题是E.W.Dijkstra 在1965年秋,为埃因霍温(Eindhoven)技术大学学生提出的一个考题,原题为五胞胎进餐问题,不久就以牛津大学教授Hoare(霍尔)所取得名字——“哲学家进餐问题”而闻名。经过中国化得哲学家进餐问题可以这样描述:5个哲学家同坐在一张圆桌旁,每个人的面前放着一碗面条,碗的两旁各摆放一根筷子。假设哲学家的生活除了吃饭就是思考(这是一...

weixin_44392808的博客 1201

Java实现哲学家进餐问题

用来描述windows操作系统下用Java语言模拟哲学家进餐的问题算法

多线程经典哲学家就餐问题 C++11 3种实现

leetcode1226. 哲学家就餐问题核心是 避免死锁 同时拿起左右叉子 class DiningPhilosophers { public: DiningPhilosophers() { } void wantsToEat(int philosopher, function<void()> pickLeftFork, function<void()>

Dave_lzw的博客 2238

Rstudio安装org.Hs.eg.db

自己也是个小白,初次安装org.Hs.eg.db碰到好多问题,步骤总结如下: 第一,instal.packages()安装,不行则换 BiocManager::install() 第二,如BiocManager不成,说明不是最新版本,可按提示安装最新版 BiocManager::install(version = '3.13') #由于R版本较新,按照提示中的相关信息,安装最新版本的 第三,再次安装 BiocManager::install("org.Hs.eg.db") 第四,之后每个人.

ZH_DDong的博客 2万+

闲置服务器之代理服务器篇

这台服务器是在阿里云免费白嫖的,天工开物计划,阿里给的300块无门槛优惠券,买了一台新加坡的境外服务器,288,刚刚抵扣完,因为是境外服务器,能够访问一些国内不能访问的网站,所以本文章仅从技术的角度来搭建代理服务器,使用时,请自觉遵守国家相关规定,如有任何违法行为,与本人无任何关系!!!。本文使用tinyproxy来搭建代理服务器。

m0_50281408的博客 2104

Linux多进程4种策略实现哲学家进餐问题

1. 任务简介 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子己在他人手上,则需等待。饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。 本实验要求利用Linux多进程实现哲学家进餐问题。 2. 思路分析 我们分析题目中的同步和互斥关系: 2.1 同步关系 本题中并不存在需要特别关注的同步关系 2.2 互

BrilliantAntonio的博客 5824

手把手教你用海康威视相机+DLP4500搭建双目结构光系统(附避坑指南)

本文详细介绍了如何使用海康威视相机和DLP4500搭建双目结构光三维测量系统,涵盖硬件选型、系统搭建、双目标定及三维重建等关键步骤。特别针对预算有限的开发者和实验室团队,提供实用的避坑指南和优化技巧,帮助实现0.02mm的高精度测量。

weixin_42526087的博客 462

用信号量解决哲学家进餐问题

哲学家进餐问题是一个经典的并发编程问题,它涉及到一群哲学家坐在圆桌周围进餐。每个哲学家都必须完成两个任务:思考和就餐。他们之间共享一些餐具,如叉子,但每个哲学家在就餐时需要同时拿到左手和右手的叉子。如果某个哲学家左右两边的叉子都被其他哲学家拿走了,那么他就无法进餐,就会陷入饥饿状态,最终可能导致死锁。

2201_75437633的博客 819

LangChain4j + MCP:从工具协议到生产级 Agent

这两年,很多团队都已经把「大模型问答」接入到系统里了:前端一个输入框,后端调一下 OpenAI / DeepSeek / 本地模型,返回一段回答——这类 「简单问答型」AI 功能它只能说,不会做:不会主动查数据库,不会调用你的接口,不会帮你真正执行脚本;面对复杂一点的需求,比如「帮我生成这个报表的 SQL 并执行一下」,普通 ChatGPT 式的问答就开始力不从心了。而Agent 智能体想解决的,就是这件事:不只是回答你「怎么做」,而是能自己思考、自己决定要不要用工具、再用工具把事做完。

OFFTime_we的博客 1152

一文讲透 SAP SD:把报价、订单、交付、开票串成一条可落地的业务闭环

摘要:SAP SD(销售与分销)模块是企业O2C(订单到收款)流程的核心,管理从客户意向到回款的完整链路。该模块围绕销售订单、交付、开票等关键环节,与财务、物料管理等模块深度集成。SD的核心在于主数据管理、单据驱动流程、定价规则引擎和信用风控,通过条件技术实现复杂定价策略,并支持多维度分析。典型应用场景包括多渠道销售企业的价格体系管理、信用控制和物流协同,有效解决销售与交付脱节、财务对账困难等业务痛点。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 512

操作系统--Java实现哲学家进餐问题

哲学家每天除了思考就是吃饭,假设一张桌子上坐了5名哲学家,他们吃饭时都必须获取两根筷子,并且他们都有着相同的习惯,先拿起左边的筷子再拿起有右边的筷子,如果获取不到两根筷子就等待。 public class Philosopher implements Runnable { private static int[] kuaizi = {1, 1, 1, 1, 1}; private int i; public Philosopher(int i) { this.i

weixin_44976835的博客 1036

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Java运行环境 双击Java.exe,安装运行环境。默认的安装路径为C:\Program Files (x86)\Java\jre6\bin,后面需要用到这个路径。 等待...

智慧空间实验室 2623

Java 哲学家进餐问题_Java实现哲学家进餐问题 | 学步园

哲学家问题是操作系统中的重要问题,我在这里谈谈对哲学家进餐的理解,同时附上源代码。哲学家进餐是对多线程的使用,这里有五位哲学家,同时只有五双筷子,如果一个哲学家想要吃饭,必须同时拿起身边的两只筷子。这样如果没有处理好就会出现死锁,于是我在这里要求第一位哲学家最先使用左边筷子,其他哲学家最先使用右边筷子,这是防止死锁的一种方法。我把拿筷子和放筷子都作为函数封装起来,在线程调用的时候就直接按照“先拿左...

weixin_42107374的博客 448

(四)DDR协议命令波形时序一——(ACT、Read、Write)

文章目录一、DDR命令真值表二、ACT激活命令时序要求2.1、ACTIVATE波形——tRRD、tFAW2.2、ACTIVATE波形——tRAS、tRC三、Read命令时序要求3.1、Read 波形——无Additive Latency3.2、Read 波形——有Additive Latency3.3、Read 波形——Additive Latency使用场景 一、DDR命令真值表 DDR的Command命令由CKE、CS#、RAS#、CAS#、WE#信号组成,这几个信号进行不同的搭配组合会形成不同的Co

Mr.翟的博客 6868

C# 调用高德地图关键词 API

今天我们要一起探索如何使用 C# 来调用高德地图的关键词搜索 API,从而实现精准的地理位置搜索功能。高德地图的关键词搜索 API 可以帮助我们轻松地实现这一点,它能够返回一系列匹配关键词的地点坐标和其他相关信息。通过简单的几行 C# 代码,我们就实现了调用高德地图关键词搜索 API 的功能。接下来,我们将在一个 C# 控制台应用中实现调用高德地图关键词搜索 API 的功能。此外,如果要在生产环境中使用,还需要考虑安全性问题,例如不要在客户端暴露 API 密钥。🔥关注墨瑾轩,带你探索编程的奥秘!

java专栏 1105

哲学家进餐问题(java模拟死锁及解决方案)

一、问题描述 哲学家进餐问题是由 Dijkstra 提出并解决的,该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。如下图所示: 二、代码模拟实现 经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信

qq_39559641的博客 5720

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java实现哲学家进餐问题(防死锁)

这篇博客与其他妖艳的骚货不同,它简单易懂(其实是高难度的不会),但是直指问题的本质。(另外和我一样是操作实习的同学不要抄我作业哦)问题描述:由Dijkstra提出并解决的哲学家进餐问题(The Dinning Philosophers Problem)是典型的同步问题。该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个...

GAYHANG的博客 2394

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【分层解耦 + 千锤百炼】操作系统的“红绿灯”:进程同步与互斥全景解析与底层源码追踪 | 老师连环压力课堂实录

Java 中的Semaphore底层全部基于AQS。核心结构:一个(同步状态) + 一个 FIFO 的双向链表(CLH 变体等待队列)。工作原理:线程通过 CAS 修改state。如果失败,则将当前线程封装成 Node 加入等待队列,并调用阻塞自己。当持有锁的线程释放锁时,会唤醒队列头部的 Node(

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 232

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

经典的进程同步问题-----哲学家进餐问题详解

​ 本文和接下来几篇博文是对上篇文章(进程同步机制)的一次实践,通过具体的例子来加深理论的理解,会用三个经典的进程同步问题来进行讲解,并且会配有伪代码和Java实践(使用多线程模拟),深入的进行讲解。 ​ 进程同步问题是一个非常重要且相当有趣的问题,本文我们对其中比较有名的哲学家进餐问题来进行探讨。哲学家进餐问题是诸进程间竞争临界资源而导致死锁的典型例子,具有很大的代表性,因此在这里我们也对其进行...

丹丹的后花园 4万+

linux 指定ps comm输出长度,ps命令查看进程指定项目信息、用户名过长显示UID

有次一个在使用ps命令时,发现部分用户显示的是用户名,有些用户显示的是UID,那是因为用户名长度超过8位的;也就是说ps命令用户名列默认只能显示8位(含8位)的用户名,超过8位就显示UID,如何让长度变大呢?创建了两个账户,分别是12345678(UID:505)、123456789(UID:506),用ps命令查看进程[root@server2 ~]# ps -efUID PID PPID C ...

weixin_30762363的博客 1740

2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )

目录 1.读者—写者问题 2.哲学家进餐问题 实现 3.管程 1.为什么要引入管程? ​2.管程的定义和基本特征 3.扩展1:用管程解决生产者消费者问题 4.扩展2:Java中类似于管程的机制 个人主页:个人主页系列专栏:操作系统 1.读者—写者问题 有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。因此要求: ①允许...

Javascript_tsj的博客 2329

基于Java窗体实现的模拟哲学家进餐演示系统

实现最多 4 个人同时拿左边筷子出现死锁问题:当时,调试查看了左边筷子的确最多同时只有被 4 个人拿起,但没有人拿右边筷子去吃饭,后来才想到如果拿到了左边筷子等待,等待完又要去拿左边筷子,肯定死锁了。输出的形式是将每种状态用一个图来表示和在一个文本框中用文字输出此时每个哲学家所处的状态,共有 4 种状态,即初始化、思考、等待和吃饭状态,每个哲学家思考、吃饭是按顺序的,即思考完后,去吃饭,如果拿不到筷子,就一直等待筷子,直到拿到为止。(5)奇数号哲学家先拿左边筷子,偶数号哲学家先拿右边筷子方法。

毕业作品网站 1646

尝试解决哲学家进餐问题(Java实现)

一. 问题描述 5个哲学家,5跟筷子,哲学家必须用两只筷子吃东西。他们只能使用自己左右手边的那两只筷子。做到不产生死锁以及要求高并发性。 二.  资源加锁法 直接给所请求的资源加锁,其他人想访问必须等待; package psy; /** * 哲学家线程 * @author stephenluu * */ public class PerThrea

鱿鱼 1万+

操作系统-Java多线程模拟AND型信号量哲学家进餐问题

package eatingQuestionOfPhilosopher; import java.util.Random; public class EatQuestionOfPhilosopher { public static void main(String[] args) { //哲学家数量 final int philosopherCount = 5; //new一个...

和太阳一样早起的博客 1003
上一篇: 《Vue.js入门》之插值与表达式
下一篇: 《Go入门》之多重赋值(使用斐波那契数列作为例子)
夜石
博客等级 码龄10年 89粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值