在项目中,经常用到一种设计模式----单例模式,下面举一个小案例,说明线程安全的单例模式在多线程中的应用,以供学习参考:
和尚吃馒头:
100个馒头,30个和尚,每个和尚最少吃一个馒头,最多不超过4个馒头,保证上述条件的情况下,尽快将馒头吃了!
要求是严格单例模式实现篮子类(存放馒头的容器)。
- <span style="font-size:18px;">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 );
- }
- }
- </span>