多线程案例----严格单例模式----和尚吃馒头问题
2017-07-29 00:14
567 查看
在项目中,经常用到一种设计模式----单例模式,下面举一个小案例,说明线程安全的单例模式在多线程中的应用,以供学习参考:
和尚吃馒头:
100个馒头,30个和尚,每个和尚最少吃一个馒头,最多不超过4个馒头,保证上述条件的情况下,
尽快将馒头吃了!
要求是严格单例模式实现篮子类(存放馒头的容器)。
和尚吃馒头:
100个馒头,30个和尚,每个和尚最少吃一个馒头,最多不超过4个馒头,保证上述条件的情况下,
尽快将馒头吃了!
要求是严格单例模式实现篮子类(存放馒头的容器)。
package java.thread; /** * */ public class MantouDemo { public static void main(String[] args) { for(int i = 0 ; i < Box.uneatedMonks ; i ++){ new Monk("tom" + i).start(); } } } //篮子 class Box{ private static Box instance = null ; private static Object lock = new Object(); //馒头总数 private int COUNT = 100 ; //没吃馒头的和尚数量 public static int uneatedMonks = 30 ; public static Box getInstance(){ if(instance != null){ return instance ; } synchronized (lock){ if(instance == null){ instance = new Box(); } return instance ; } } private Box(){ } //获取馒头 public int getMantou(Monk monk){ //1.是否还有可吃馒头 if(COUNT == 0){ return 0 ; } //2.和尚是否吃饱了 if(monk.getCount() == Monk.MAX){ return 0 ; } //3.还有多余的馒头 if(COUNT > uneatedMonks){ int tmp = COUNT ; COUNT -- ; //和尚是否是第一次吃馒头 if(monk.getCount() == 0){ uneatedMonks -- ; } return tmp ; } //没有多余的馒头 else{ if(monk.getCount() == 0){ int tmp = COUNT; COUNT--; uneatedMonks--; return tmp ; } } return 0 ; } } //和尚 class Monk extends Thread{ public static int MAX = 4 ; public static int MIN = 1 ; //和尚吃了馒头的数量 private int count = 0 ; public int getCount() { return count; } public void setCount(int count) { this.count = count; } private String monkName ; public Monk(String monkName) { this.monkName = monkName ; } public void run() { Box box = Box.getInstance(); while(true){ int mantouNo = box.getMantou(this) ; if(mantouNo != 0){ count ++ ; } else{ break ; } yield(); } System.out.println(monkName + " : " + count ); } }
相关文章推荐
- 3-2-Java多线程-案例-单例设计模式出现的问题
- 【代码练习4】利用多线程处理和尚吃馒头问题
- 多线程安全问题在单例模式中的体现(懒汉式&饿汉式)
- 风险案例-24期-缺少严格的变更及版本控制流程,导致问题反复,调试工作量和时间增加
- 【怎样写代码】确保对象的唯一性 -- 单例模式(一):问题案例
- JS严格模式下常见问题汇总
- 多线程安全问题案例1 单例注入的类中含非线程安全属性
- java基础—多线程下的单例设计模式的安全问题
- 浅析MVP模式中V-P交互问题及案例分享
- java多线程之生产者和消费者经典问题案例
- 单例模式,多线程同时访问一个实例对象问题的处理,加lock .
- this指向问题——严格、非严格模式,事件处理程序
- 解决多线程单例模式的线程不安全问题
- 单例模式的懒汉式在多线程的问题
- Java多线程的一个案例-生产者消费者问题
- 多线程经典案例——生产者/消费者问题的Java实现与详解
- 【java】单例模式涉及的多线程问题
- javascript中严格模式中的作用域问题
- servlet单实例多线程模式问题
- JavaSE 多线程 单例设计模式涉及的多线程问题