在项目中,经常用到一种设计模式----单例模式,下面举一个小案例,说明线程安全的单例模式在多线程中的应用,以供学习参考:

和尚吃馒头:

100个馒头,30个和尚,每个和尚最少吃一个馒头,最多不超过4个馒头,保证上述条件的情况下,
尽快将馒头吃了!

要求是严格单例模式实现篮子类(存放馒头的容器)。

[java] view plaincopy print?
  1. <span style="font-size:18px;">package java.thread;
  2. /**
  3. *
  4. */
  5. public class MantouDemo {
  6. public static void main(String[] args) {
  7. for(int i = 0 ; i < Box.uneatedMonks ; i ++){
  8. new Monk("tom" + i).start();
  9. }
  10. }
  11. }
  12. //篮子
  13. class Box{
  14. private static Box instance = null ;
  15. private static Object lock = new Object();
  16. //馒头总数
  17. private int COUNT = 100 ;
  18. //没吃馒头的和尚数量
  19. public static int uneatedMonks = 30 ;
  20. public static Box getInstance(){
  21. if(instance != null){
  22. return instance ;
  23. }
  24. synchronized (lock){
  25. if(instance == null){
  26. instance = new Box();
  27. }
  28. return instance ;
  29. }
  30. }
  31. private Box(){
  32. }
  33. //获取馒头
  34. public int getMantou(Monk monk){
  35. //1.是否还有可吃馒头
  36. if(COUNT == 0){
  37. return 0 ;
  38. }
  39. //2.和尚是否吃饱了
  40. if(monk.getCount() == Monk.MAX){
  41. return 0 ;
  42. }
  43. //3.还有多余的馒头
  44. if(COUNT > uneatedMonks){
  45. int tmp = COUNT ;
  46. COUNT -- ;
  47. //和尚是否是第一次吃馒头
  48. if(monk.getCount() == 0){
  49. uneatedMonks -- ;
  50. }
  51. return tmp ;
  52. }
  53. //没有多余的馒头
  54. else{
  55. if(monk.getCount() == 0){
  56. int tmp = COUNT;
  57. COUNT--;
  58. uneatedMonks--;
  59. return tmp ;
  60. }
  61. }
  62. return 0 ;
  63. }
  64. }
  65. //和尚
  66. class Monk extends Thread{
  67. public static int MAX = 4 ;
  68. public static int MIN = 1 ;
  69. //和尚吃了馒头的数量
  70. private int count = 0 ;
  71. public int getCount() {
  72. return count;
  73. }
  74. public void setCount(int count) {
  75. this.count = count;
  76. }
  77. private String monkName ;
  78. public Monk(String monkName) {
  79. this.monkName = monkName ;
  80. }
  81. public void run() {
  82. Box box = Box.getInstance();
  83. while(true){
  84. int mantouNo = box.getMantou(this) ;
  85. if(mantouNo != 0){
  86. count ++ ;
  87. }
  88. else{
  89. break ;
  90. }
  91. yield();
  92. }
  93. System.out.println(monkName + " : " + count );
  94. }
  95. }
  96. </span>

多线程---和尚吃馒头问题相关推荐

  1. 多线程案例----严格单例模式----和尚吃馒头问题

    在项目中,经常用到一种设计模式----单例模式,下面举一个小案例,说明线程安全的单例模式在多线程中的应用,以供学习参考: 和尚吃馒头: 100个馒头,30个和尚,每个和尚最少吃一个馒头,最多不超过4个 ...

  2. Java 多线程实现和尚吃馒头的问题

    和尚吃馒头问题 30和尚,100个馒头,每个和尚最多吃4个馒头,最少吃1个馒头,一次只能吃1个馒头. 满足上述条件,尽快吃光馒头. 注意 合适没吃一个馒头之后要 yield(),不然他会连续吃满4个馒 ...

  3. 【代码练习4】利用多线程处理和尚吃馒头问题

    和尚吃馒头 30个和尚,100个馒头,每个和尚至少吃一个馒头,最多不过4个馒头. 满足上述条件下,尽快将馒头吃完. 思路:开启多线程,以最快的速度抢占馒头,首先抢到4个馒头的线程就停止掉:当剩余的馒头 ...

  4. Java多线程同步问题(和尚吃馒头问题)

    创建一个和尚类 public class Basket {private int count = 100 ;//和尚数量 ==没吃馒头的和尚数量private int numMonks = 30 ;p ...

  5. 和尚吃馒头c语言程序,(八十一)约瑟夫环/鲁智深吃馒头

    问题:99个人,99个馒头,来了一个鲁智深,找个位置把他放进去,然后每逢五的人,吃一个馒头,并且退场,最后让他无法吃. 代码: #include int main() { using namespac ...

  6. java 大数据(多线程)和尚分馒头 整理

    Box 箱子类.Monk和尚类.App测试类 Box 箱子类 package com.xc.thread.monk;/*** 馒头箱子* @author Administrator**/ public ...

  7. 有一个和尚负责做馒头,做好30个其它三个和尚就可以吃馒头, *当馒头吃完了,第一个和尚就再做30个馒头 生产消费

    package ;import java.util.ArrayList; import java.util.List;/** * Created by dell on 2017/5/4. * 有一个和 ...

  8. 数组的趣味应用-鲁智深吃馒头

    鲁智深吃馒头 据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头.智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说: 从我开始报数(围成 ...

  9. C语言趣味题——鲁智深吃馒头问题

    题目:鲁智深吃馒头 据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头,智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说,从我开始报数( ...

最新文章

  1. python nginx部署_Python 应用 uWSGI + Nginx 部署
  2. mysql半同步复制问题排查
  3. mciSendString用法
  4. 为什么优秀的程序员都写博客?谈谈我都是如何写作的
  5. 职高学的计算机单招考试能换专业吗,2020年湖南中专生单招考大专能换专业吗?...
  6. PowerDesigner16.5安装
  7. mysql建立从库同时备份_mysql主从库配置读写分离以及备份
  8. python大神的成长之路_我的Python成长之路
  9. java在线编辑器_微软开源在线代码编辑器——Monaco Editor
  10. thinkphp mysql 中文 问号_thinkphp分页中文参数乱码解决
  11. Matlab将数字数组转换为字符数组(用于标明点号)
  12. PC端编辑 但能在PC端模拟移动端预览的富文本编辑器
  13. mfc mfc100ud.dll丢失问题
  14. python命令行tab实例小妙招
  15. 【SQLServer】将Job运行结果发送电子邮件通知用户
  16. 计算机英语写作题范文,2018年6月英语四级考试写作范文:人与电脑
  17. Mysql中WhereIn和Join的性能比对
  18. 系统从win7更新到win10没有声音(扬声器一直显示未插入)
  19. 从Realme GT的安兔兔跑分开始谈起
  20. 使用TexturePacker命令行的一个坑

热门文章

  1. Jenkins之构建触发器(Build Triggers)
  2. Mac OS X 10.7.5 Lion 系统安装 U 盘制作
  3. Numpy API 速查表
  4. java 解密pdf_Java 加密和解密 PDF
  5. 了解C语言中的pipe()系统调用
  6. mysql左链表右链表区别_MySql链表语句--博客园老牛大讲堂
  7. 20180402-B · US Tuition Costs · ggplot2, 条线图 柱状图 · R 语言数据可视化 案例 源码
  8. Accepted Necklace HDU - 2660
  9. newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解
  10. unity游戏存档playerprefs