Thinking in java 哲学家进食问题

Java基础学习之并发篇:哲学家就餐问题 学习目标 提示:这里可以添加学习目标 例如:一周掌握 Java 入门知识 阅读详情

DeadlockingDiningPhilosopher.java

哲学家围着圆桌坐下,左右各有一根筷子,需要同时拥有左右筷子才能进食。

筷子是共享资源,使用和释放资源需要加锁处理。如果所有的哲学界都是先取左边的筷子,就会导致每个哲学家都有一根筷子,等待自己右边的哲学家释放筷子,从而陷入死锁的状态。

package com.test.concurrent;

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class DeadlockingDiningPhilosopher {

	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		int ponder=10;
		int size=5;
		ExecutorService exec=Executors.newCachedThreadPool();
		ChopStick[] sticks=new ChopStick[size];
		for(int i=0;i<size;i++){
			sticks[i]=new ChopStick();
		}
		for(int i=0;i<size;i++){
			exec.execute(new Philosopher(sticks[i],sticks[(i+1)%size],i,ponder));
			//此处可以通过修改最后一个哲学家取筷子的顺序来避免死锁,最后一个反序取筷子
		}
		TimeUnit.SECONDS.sleep(5);
		exec.shutdownNow();
		System.out.println("total eat count:"+Philosopher.eatcount);
	}

}

class ChopStick{
	private boolean taken=false;
	public synchronized void take() throws InterruptedException{
		while(taken){
			wait();
		}
		taken=true;
	}
	public synchronized void drop(){
		taken=false;
		notifyAll();
	}
}
class Philosopher implements Runnable{
	public static int eatcount=0;
	private ChopStick left;
	private ChopStick right;
	private final int id;
	private final int ponderFactor;
	private Random rand=new Random(47);
	public Philosopher(ChopStick left,ChopStick right,int ident,int ponder){
		id=ident;
		ponderFactor=ponder;
		this.left=left;
		this.right=right;
	}
	private void pause() throws InterruptedException{
		if(ponderFactor==0)
			return;
		TimeUnit.MILLISECONDS.sleep(rand.nextInt(ponderFactor*250));
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			while(!Thread.interrupted()){
				System.out.println(this+"  "+"thinking   ");
				pause();
				
				System.out.print(this+"  grbbing right  ");
				right.take();
				
				System.out.print(this+"   grabbing left  ");
				left.take();
				
				System.out.println(this+" is eating!!!! ");
				eatcount++;
				right.drop();
				left.drop();
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public String toString(){
		return "Philosopher "+id;
	}
	
}


24、进程同步与监控器机制详解 本文详细探讨了进程同步的核心问题及解决方案,重点分析了信号量机制与监控器机制的原理与实现。通过哲学家就餐问题,展示了信号量使用的常见问题及改进策略,并深入解析了监控器机制及其在解决同步问题中的优势。文章还介绍了多种操作系统(如Java、Solaris、Windows、Linux和Pthreads)中同步机制的实现和特点,并通过示例和流程图展示其应用方式。最后,探讨了事务性内存这一新兴技术在并发编程中的作用。 阅读详情

相关推荐

JAVA实现哲学家就餐问题

用JAVA实现哲学家就餐问题,本源码中采用的是奇数号哲学家先拿左手后拿右手,而偶数号哲学家采用先拿右手后拿左手的策略来预防死锁。

Java并发编程:死锁场景之哲学家就餐问题

这是一个常见的死锁场景题目来源是力扣自己去搜就行了,下面直接上代码上述情况就容易发生5个哲学家都拿着一根筷子同时也想拿另一根筷子就陷入了死锁。

SubsistAssistBot的博客 284

Java实现哲学家进餐问题

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

Java并发编程78讲--71 第71讲:讲一讲经典的哲学家就餐问题

下面我们进行总结。在本课时,我们介绍了什么是哲学家就餐问题,并且发现了这其中蕴含着死锁的风险,同时用代码去演示了发生死锁的情况;之后给出了几种解决方案,比如死锁的检测与恢复、死锁避免,同时我们对于死锁避免的这种情况给出了代码示例。

g_z_q_的博客 309

Java哲学家问题的解决方法,进程管理

使用java解决的哲学家问题,但并不是用的P,V原语的方法,使用的是加锁的解决方法,算是一种伪PV吧。

JAVA哲学家就餐问题

JAVA 哲学家就餐问题

Java并发-哲学家吃饭问题

科学家吃饭问题

abc123mma的博客 688

java五个哲学家问题

关于java多线程的运用中五个哲学家的问题。五个哲学家分别围坐在的圆桌旁,每个哲学家面前只有一根筷子,关于哲学家如何吃饭的问题。

哲学家就餐问题(java全代码)

java实现哲学家就餐问题

weixin_60401853的博客 1297

MICROSAR OS:第一个task是如何执行起来的?

MICROSAR OS是Vector公司开发的符合AUTOSAR OS规范的实时操作系统。本文介绍MICROSAR

humu7733的博客 2571

海康/大华设备如何接入GB28181平台?最新2022版互联避坑指南

本文详细解析了海康/大华设备接入GB28181平台的最新2022版互联避坑指南,涵盖参数配置、实时视音频点播协议交互及典型故障排查。重点介绍了GB/T28181-2022标准下的设备编码规范、SIP服务器配置及媒体流保活机制,帮助工程团队高效解决设备离线和媒体流中断等问题。

weixin_30733003的博客 687

java 哲学家_用java写的哲学家问题

【实例简介】用java的图形界面实现的,不死锁哲学家问题【实例截图】【核心代码】5abeace1-1b0e-4cf8-aeef-0598146ad649└── zxjwt├── build│ ├── built-jar.properties│ └── classes│ └── zxjwt│ ├── NewClass$button$1.class│ ...

weixin_28882103的博客 197

STM32 FOC电机控制:手把手教你用CubeMX配置TIM1中心对齐PWM(含代码避坑)

本文详细解析了STM32 FOC电机控制中TIM1中心对齐PWM的配置方法,涵盖CubeMX图形化设置、HAL库代码调用及常见问题排查。特别针对L6230Q驱动芯片的使能逻辑和死区时间配置提供实用指南,帮助开发者高效实现无刷电机的高性能控制。

weixin_27027459的博客 444

哲学家进餐问题与生产者与消费者问题(java实现)

import java.util.concurrent.Semaphore; public class Test2 { /** * 哲学家进餐问题 */ public static void main(String[] args) { new Thread(new philosopher(0)).start(); new Thread(new philosopher(1)).star

Full Stack 3333

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】

w0shishabi的博客 2923

深度学习论文: Cultivated Land Extraction from High-Resolution Remote Sensing Image

深度学习论文: Cultivated Land Extraction from High-Resolution Remote Sensing Image The Winning Solution to the iFLYTEK Challenge 2021 Cultivated Land Extraction from High-Resolution Remote Sensing Image PDF: https://arxiv.org/pdf/2202.10974.pdf PyTorch代码: https:

mingo_敏 3480

哲学家进餐问题(Java代码实现)

5位哲学家围坐在圆桌旁,每人面前有一碗饭,左右各有一根筷子。

iov_a的博客 1170

PR工具timing report中setup time的计算过程

然后去pr工具里报告report_delay_calculation/reportDelayCalculation -from related_pin -to constraint_pin。这里constraint pin就是D pin (D0 D1 D2 D3),related pin就是 CK pin。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 457

【Java|多线程与高并发】死锁以及哲学家吃饭问题

死锁(Deadlock)是多线程编程中的一个常见问题,指的是两个或多个线程相互等待对方释放资源,导致程序无法继续执行的状态。在一种典型的死锁情况中,有两个或多个线程,每个线程都在持有一个资源的同时试图获得另一个线程持有的资源。当两个线程都在等待对方释放资源时,它们将永远无法继续执行,产生了死锁。System . out . println("t1获取locker1");try {System . out . println("t1获取locker2");} } });

云泽野の编程日记 373

2026年数学建模国赛B题无线电干扰源的快速自动定位与清除 论文详细解析

数学建模竞赛论文无线电干扰源的快速自动定位与清除2026 年高教社杯全国大学生数学建模竞赛 B 题完整求解论文交会定位、极大极小测点优化、自适应多频道搜索与定向源恢复的统一建模模型、算法、代码、图表与验证一体化交付本文研究圆形目标区域中多个未知无线电干扰源的快速检测、定位与清除问题,建立了由误差楔交会模型、角度观测信息模型、分层勘测模型、鲁棒射线交会模型和定向覆盖反馈模型组成的统一求解框架。模型同时覆盖题目中的四个子问题:多测向射线形成的多边形定位区域及直径、第二个测点的极大极小优选、全向源自动搜索清除策略

YOLO 360

芒果YOLOv10改进31:特征融合Neck篇:改进特征融合网络 BiFPN 结构,融合更多有效特征

YOLOv10改进:特征融合Neck篇:改进特征融合网络 BiFPN 结构,融合更多有效特征

包括YOLOv5、YOLOv7、YOLOv8等模型改进 684

java 哲学家_哲学家问题(java)的三个解法

//让刚吃完的一个人阻塞,5根筷子供4个人选,则必有一个人获得在其左右的两双筷子public class Philosopher1 implementsRunnable {int[] ifeat=new int[5];int[] fork=new int[5];intnoteat;Thread thread1=new Thread(this,"1");Thread thread2=new Thre...

weixin_34409903的博客 584

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

并发(13):死锁

除了最后一个Philosopher,其他所有的Philosopher都是通过将这个Philosopher定位于下一对Chopstick对象之间而被初始化的,而最后一个Philosopher右边的Chopstick是第0个Chopstick,这样这个循环表也就结束了。如果Philosopher花费更多的时间去思考而不是进餐(使用非0的ponder值,或者大量的Philosopher),那么他们请求共享资源(Chopstick)的可能性就会小许多,这样你就会确信该程序不会死锁,尽管他们并非如此。

游王子og的博客 296

STM32F407中文手册

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

《深入解析Java synchronized死锁:从可重入锁到哲学家就餐问题》

从synchronized方法的使用到可重入锁的本质,再到死锁的经典场景哲学家就餐问题,本文系统拆解Java并发编程中的死锁难题。通过理论推导与代码实例,深入探讨死锁的四大必要条件,并给出可落地的预防方案,为你的高并发代码保驾护航。

一年,我很需要这一年 4134

哲学家就餐问题之java解决

文章目录前言如何解决这个问题呢1.线程粗化2.奇偶互反3.最少保证 前言 哲学家就餐问题是在计算机科学中的一个经典问题,用来演示在并行计算中多线程同步(Synchronization)时产生的问题。 有五个哲学家,他们共用一张圆桌,分别坐在五张椅子上。在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。 代码描述: public class PhilosopherThread extends Thread

大道坦荡的博客 6596

java代码演示经典哲学家就餐问题,以及解决方案

哲学家就餐问题 哲学家每天除了思考就是吃饭,假设一张桌子上坐了5名哲学家,他们吃饭时都必须获取两根筷子,并且他们都有着相同的习惯,先拿起左边的筷子再拿起有右边的筷子,如果获取不到两根筷子就等待。 代码演示死锁情况: public class DiningPhilosophers{ public static class Philosopher implements Runnable { private Object leftChopstick; private Ob

qq_44703805的博客 1095
上一篇: Thinking in Java学习笔记 CountDownLatch(CountDownLatchDemo.java)
下一篇: Thinking in Java学习笔记
fantasyagain
博客等级 码龄19年 18粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值