java用信号量写理发师_课内资源 - 基于Java实现的生产者与消费者问题、读者写者问题、哲学家进餐问题、理发师睡觉问题、医生看病问题...

这篇博客通过Java探讨了五种并发问题的解决方案,包括生产者消费者问题、读者写者问题、哲学家进餐问题、理发师睡觉问题和医生看病问题。使用信号量和同步机制解决资源竞争,如缓冲池、作品、筷子和病椅等资源的访问控制。
摘要由CSDN通过智能技术生成

本次实验一共5道题目,其实本质上的关系还是很大的,有很多共性。

5次题目的算法均用Java写的,为了简单,输出在控制台上。最后一个医生与病人问题写了一个界面。

生产者与消费者和读者写者问题都是两类物品同时申请一类资源。

哲学家进餐问题和理发师睡觉问题和医生看病问题都是一类物品申请一类或多类资源

生产者与消费者问题中,只有缓冲池这一类资源,但是生产者和消费者同时要进行写操作(加一或者减一)。

读者和写者问题中,只有作品这一类资源,读者和写者同时要进程写操作,但不同的是,写者和写者之间是互斥的!而生产者与生产者之间并不是互斥的。

生产者与消费者问题

设置每个缓冲池为信号量。当某个生产者访问某个缓冲池,则该缓冲池就会“被锁”。利用Java中的synchronized 关键字。同理,消费者访问某个缓冲池,该缓冲池也同样会被锁。

生产者访问缓冲池有两种情况:

所有缓冲池都是满的了:此时生产者则会让权等待,放弃该缓冲池的锁,利用Java的buffer.wait方法

仍然有空的缓冲池:找一个空的缓冲池写数据,同时该缓冲池被锁

同理,消费者也是如此。

读者与写者问题

设置readerCount和 writerCount变量。当写者写数据的时候,检查是否有读者在读,和是否有写者在写,如果都没有,才会去写数据,写数据的过程中把作品上锁!

哲学家进餐问题

5个筷子,每个筷子都设置为一个信号量。再设置一个布尔型数组,初始5个FALSE。当一个哲学家准备吃饭时,先检测左右两边的筷子是否都空闲,如果是,则拿起两双筷子,否则等待。吃饭的时候,将左右两双筷子上锁。吃饭之后,同时释放左右两支筷子。

理发师睡觉问题

只有顾客一类物品申请资源。则设置理发师为信号量。设置isDressing变量,当理发师给顾客理发时,isDressing设置为true。顾客来之后,先检测理发师是否在理发,在理发,则继续检测空闲椅子数量,如果有空闲椅子,则等待,并且在while循环中持续检测理发师是否已经完成了理发。如果没有空闲椅子,则离开。

医生看病问题

其实和理发师睡觉问题很类似,不过是把一个理发师换成了三个理发师,所以把isDressing变量换成了一个整形变量代表理发师的数量。病人来之后,先检测病椅数量,如果病椅数量为0,则继续检测等椅数量,如果有空闲等椅,则进入循环等待,一直检测是否有病椅可用。如果没有空闲等椅,则离开。

6b38ade9a6aa4a6a30a8a5f75e825560.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值