哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。哲学家就餐问题有时也用米饭和筷子而不是意大利面和餐叉来描述,因为很明显,吃米饭必须用两根筷子,这样可描述为多线程争夺资源的问题。

由此问题可引入多线程争夺锁的问题,造成相互等待的问题。如果其中至少有一位“左撇子”,可解决此问题:

package Thread;public class DeadLock {public static void main(String[] args) {ChopStick cs0 = new ChopStick();ChopStick cs1 = new ChopStick();ChopStick cs2 = new ChopStick();ChopStick cs3 = new ChopStick();ChopStick cs4 = new ChopStick();Philosohper p0 = new Philosohper("p0", cs0, cs1, 0);Philosohper p1 = new Philosohper("p1", cs1, cs2, 1);Philosohper p2 = new Philosohper("p2", cs2, cs3, 2);Philosohper p3 = new Philosohper("p3", cs3, cs4, 3);Philosohper p4 = new Philosohper("p4", cs4, cs0, 4);p0.start();p1.start();p2.start();p3.start();p4.start();}public static class Philosohper extends Thread {private ChopStick left, right;private int index;public Philosohper(String name, ChopStick left, ChopStick right, int index) {this.setName(name);this.left = left;this.right = right;this.index = index;}@Overridepublic void run() {if (index % 2 == 0) {synchronized (left) {try {Thread.sleep(1 + index);synchronized (right) {Thread.sleep(index);System.out.println(index + "号已经吃完————————————————————————————————");}} catch (InterruptedException e) {e.printStackTrace();}}} else {synchronized (right) {try {Thread.sleep(1 + index);synchronized (left) {Thread.sleep(index);System.out.println(index + "号已经吃完————————————————————————————————");}} catch (InterruptedException e) {e.printStackTrace();}}}}}}class ChopStick {}

哲学家用餐问题——多线程死锁问题相关推荐

  1. Java算法完美解决五位哲学家用餐问题

    五位哲学家用餐问题相信大家也知道,大概就是五位哲学家在圆形餐桌上吃饭,每两位哲学家之间有一根筷子,即每位哲学家左右两边都有一根筷子,接下来哲学家的步骤是:拿起左右筷子用餐   =>中间放下左右筷 ...

  2. 同软件多个线程设置不同ip_5-13网络编程(附带多线程死锁,线程通信)

    0513多线程 死锁 当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步.这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁 线程通信 生产者消费者模式 模拟街道案例 wai ...

  3. 一个多线程死锁案例,如何避免及解决死锁问题?

    多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去翻看历史文章吧. 下面是一个多线程死锁的例子 public class lock{priv ...

  4. 一个多线程死锁案例,如何避免及解决死锁问题

    转载自 一个多线程死锁案例,如何避免及解决死锁问题 多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去翻看历史文章吧. 下面是一个多线程死锁 ...

  5. 哲学家就餐(避免死锁)(多进程版)

    哲学家就餐(避免死锁)(多进程版) 哲学家就餐利用信号量在多进程之间实现 下面展示一些代码片段 #include <stdio.h> #include <unistd.h> # ...

  6. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

  7. java多线程死锁代码_java多线程死锁 编写高质量代码:改善Java程序的151个建议...

    java多线程死锁 编写高质量代码:改善Java程序的151个建议 第1章 Java开发中的通用方法和准则 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的 ...

  8. Thinking in Java---从哲学家就餐问题看死锁现象

    我们知道一个对象可以有synchronized方法或其他形式的加锁机制来防止别的线程在互斥还没释放的时候就访问这个对象.而且我们知道线程是会变成阻塞状态的(挂起),所以有时候就会发生死锁的情况:某个任 ...

  9. gdb调试分析多线程死锁

    gdb调试分析多线程死锁 #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include ...

最新文章

  1. linux下添加路由的方法
  2. U-Boot常用命令
  3. dropdownlist三级联动怎么实现_Excel下拉菜单不会做?15秒教会你制作一二三级联动下拉菜单,从此做表不求人!...
  4. 局部特征(local feature)
  5. asp.net 二级域名(路由方式实现)
  6. hive解决数据倾斜问题_Hive数据倾斜和解决办法
  7. 长路漫漫,唯剑作伴--Automatic Reference Counting
  8. 工具_HBuilder使用快捷方式
  9. python文件只读模式_Python脚本去除文件的只读性操作
  10. Apache yarn入门介绍
  11. 城市轨道交通运营管理属于什么院系_2020年报考山东交通职业学院城市轨道交通运营管理专业怎么样...
  12. 微信小程序:动画效果集合
  13. 给Intel AX200装上个Killer 1650X驱动
  14. codesys工控机_CODESYS在系统集成项目中的运用案例
  15. rtklib 后处理_RTKLib的Manual解读
  16. 利用鱼塘理论告诉你2020年怎么做IP运营推广
  17. 北京文安科技发展有限公司招聘简介
  18. MyBatis学习(一)
  19. 腾讯云实时音视频( TRTC)通话质量监控仪表盘
  20. Software Performance Testing - 全链路压测知识点整理

热门文章

  1. 基于ensp防火墙双击热备二层网络规划与设计
  2. 基于SSM的旅游景点门票管理系统,高质量毕业论文范例(可直接使用),附送源码和数据库脚本,项目导入运行视频教程,论文撰写教程
  3. 啦啦外卖公众号+小程序 V43.0开源至尊独立版+独家用户授权升级+小程序端+APP源码+小程序端VUE源码安装教程
  4. CentOS 硬盘管理实践
  5. HDFS Shell命令练习
  6. Android 反编译获取class代码
  7. Mac中文字体显示异常修复
  8. CAD绘制一厅一室房型平面图
  9. C语言源代码系列-管理系统之职工信息管理系统
  10. 2022李宏毅机器学习深度学习学习笔记--第一周