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

本文通过一个和尚吃馒头的案例,探讨在多线程环境中如何实现线程安全的单例模式。案例旨在说明如何确保在并发情况下,单例类的实例仍然能够被正确且唯一地创建和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

    和尚吃馒头:

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 );
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值