读者写者问题模拟

 

一、实验目的:

  1. 通过实现读者写者模拟程序,加深对并发编程中同步和互斥的理解。
  2. 熟悉使用Semaphore来管理并发访问共享资源的机制。
  3. 探讨读者写者问题中的解决方案,如何平衡读取和写入的需求。

 

实验设备与实验环境:

计算机,Java编译系统,idea,文心一言3.5

 

二、实验程序设计内容:

  1.         设计一个读者写者模拟程序,包括读者线程和写者线程。
  2. 使用Semaphore来管理读者和写者对共享资源的访问。
  3. 实现读者线程对共享资源的读取操作和写者线程对共享资源的写入操作。
  4. 确保在任一时刻只有一个写者或多个读者可以访问共享资源,避免读者与写者之间的冲突。

 

三、实验程序设计思路及流程图

  1. 使用两个Semaphore对象mutex和writeLock来实现读者写者问题的互斥访问。
  2. 在Reader线程中,先获取mutex的许可,然后增加读者计数,如果是第一个读者,则获取writeLock的许可,释放mutex,进行读取操作,最后减少读者计数,如果没有读者则释放writeLock。
  3. 在Writer线程中,直接获取writeLock的许可,进行写入操作,然后释放writeLock。
  4. 在main方法中创建多个读者线程和写者线程,并启动它们进行并发访问。

四、实验源程序及注释:

ackage homework.os;

  

import java.util.concurrent.Semaphore;

  

  /**

 * Date:2024/5/14  10:37

 * Description:ReaderWriterSimulation

 *

 * 该程序使用信号量模拟读者-写者问题。

 * 在这个问题中,多个读者线程和写者线程同时访问共享资源。

 * 读者可以同时读取资源,但只有一个写者可以写入资源。

 *

 * @author Leon

 * @version 1.0

 */

  

  public class exm6 {

  

    private static Semaphore mutex = new Semaphore(1); // 互斥信号量

    private static Semaphore writeLock = new Semaphore(1); // 写锁信号量

    private static int readers = 0; // 活跃读者数量

  

    private static class Reader implements Runnable {

  

        @Override

        public void run() {

            try {

                mutex.acquire(); // 获取互斥信号量以增加读者数量

                readers++;

                if (readers == 1) {

                    writeLock.acquire(); // 第一个读者获取写锁以阻止写者

                }

                mutex.release(); // 释放互斥信号量给其他读者

  

                // 读操作

                System.out.println("Reader is reading...");

  

                mutex.acquire(); // 获取互斥信号量以减少读者数量

                readers--;

                if (readers == 0) {

                    writeLock.release(); // 最后一个读者释放写锁以允许写者

                }

                mutex.release(); // 释放互斥信号量

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

  

    private static class Writer implements Runnable {

  

        @Override

        public void run() {

            try {

                writeLock.acquire(); // 获取写锁以开始写入

  

                // 写操作

                System.out.println("Writer is writing...");

  

                writeLock.release(); // 释放写锁

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

  

    public static void main(String[] args) {

        Thread[] readers = new Thread[5]; // 5个读者线程

        Thread[] writers = new Thread[2]; // 2个写者线程

  

        // 启动读者线程

        for (int i = 0; i < readers.length; i++) {

            readers[i] = new Thread(new Reader());

            readers[i].start();

        }

  

        // 启动写者线程

        for (int i = 0; i < writers.length; i++) {

            writers[i] = new Thread(new Writer());

            writers[i].start();

        }

    }

  }

 

五、实验程序测试过程及解释说明

使用了两个信号量mutex和writeLock来控制读者写者的访问。mutex用于保护readers变量,writeLock用于保护写操作。当有读者在读取时,其他读者可以同时读取,但写者需要等待。当有写者在写入时,所有读者和写者都需要等待。

六、实验程序测试过程与结果分析、

运行程序后,可以看到读者和写者交替进行读写操作。读者读取时不会被写者打断,写者写入时会独占资源

 

Reader is reading...

Reader is reading...

Reader is reading...

Reader is reading...

Reader is reading...

Writer is writing...

Writer is writing...

 

Process finished with exit code 0

 

七、理论学习与实践能力锻炼方面的个人心得体会

通过实现这个读者写者模拟程序,我深刻体会到了并发编程中同步和互斥的重要性。合理地使用信号量来管理共享资源的访问,能够有效地避免竞争条件和死锁问题。在设计并发程序时,需要仔细考虑线程之间的交互关系,确保数据的一致性和正确性。这个实验让我更加熟悉了并发编程的技术,提高了我的编程能力和对多线程编程模型的理解。

 

 

 

 

 

                

实验评价及结论:

实验目的明确、设计内容符合要求,独立完成了操作系统读者写者问题(读者优先)程序设计任务且源程序与注释、测试过程记录完整正确,能够很好地将课程理论运用于解决实际问题;实验报告内容完整,态度认真,总体质量优秀。

 

 

 

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vⅤ_Leon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值