读者写者问题模拟

一、实验目的:

  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 {@Overridepublic 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 {@Overridepublic 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

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

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

                

实验评价及结论:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

头图的标题内容没有中文但无法显示

编译引擎问题&#xff1a; 确保你使用的编译引擎支持中文字符的显示。如果你在使用 XeLaTeX 或 LuaLaTeX 编译引擎&#xff0c;请确保你的文档中正确设置了中文字体&#xff0c;并且编译引擎能够正确识别和渲染中文字符。 字体设置问题&#xff1a; 如果你在文档中设置了中文字…

linux fdisk 银河麒麟操作系统 v10 磁盘分区和挂载 详细教程

1查看 未加载的磁盘 fdisk -l 2 开始分区 fdisk /dev/vdb #查看分区 #新建分区和保存 3 格式化和挂载 fdisk -l mkfs.xfs /dev/vdb1 #查看uuid blkid /dev/vdb1 mkdir /data vi /etc/fstab UUID209daa-fb1c-48f2-bf5e-e63f38cb8a /data xfs defaults 0 0 #加载下 mo…

【bug记录】Vue3 Vant UI 中 van-popup 不弹出

原因&#xff1a;语法使用错误&#xff0c;使用了 Vue 2 的语法 Vue3语法&#xff1a; Vue2语法&#xff1a;

【设计模式】23种设计模式概览及应用示例

设计模式&#xff08;Design Patterns&#xff09;是软件工程中用于解决特定问题的一系列最佳实践。它们是经过时间考验的、被广泛认可的软件设计经验&#xff0c;可以帮助开发者在面对常见问题时做出更好的设计决策。设计模式不是现成的代码&#xff0c;而是一套指导原则&…

redis攻防知识汇总

目录 redis漏洞原理 4.redis漏洞利用 4.1利用redis漏洞写webshell 4.1.1利用前提 4.1.2上传webshell

【JavaEE 初阶(六)】网络编程

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多网络知识 目录 1.前言2.浅谈网络2.1基本知识2.2.OSI与TCP/IP 3.网络编程3.1TCP与UDP区别3.2UDP网路编程…

四川易点慧电商抖音小店:优势尽显,引领电商新潮流

在当下这个信息爆炸、消费模式日新月异的时代&#xff0c;电商行业正在经历一场前所未有的变革。四川易点慧电商抖音小店凭借其独特的优势&#xff0c;成功吸引了大量消费者的目光&#xff0c;成为电商领域的一股新势力。 四川易点慧电商抖音小店的最大优势在于其强大的品牌影…

Vue3实战笔记(19)—封装菜单组件

文章目录 前言一、封装左侧菜单导航组件二、使用步骤三、小彩蛋总结 前言 在Vue 3中封装一个左侧导航菜单组件是一项提升项目结构清晰度和代码可复用性的关键任务。这个过程不仅涉及组件的设计与实现&#xff0c;还需考虑其灵活性、易用性以及与Vue 3新特性的紧密结合。以下是…

如何恢复删除的文件?收好6个恢复策略!

“我经常在操作电脑时可能会有误删文件的情况发生&#xff0c;如果我不小心删除了重要的文件&#xff0c;应该使用什么方法来恢复它们呢&#xff1f;求解答&#xff01;” 在使用电脑时&#xff0c;我们可能一个手滑就误删了重要的文件。当文件删除后&#xff0c;如果没有掌握相…

用调试的方式来阅读复杂的C++工程代码以及调试技巧

目录 1 用调试的方法阅读代码 1.2 从外到里,从整体到局部 1.2 从里到外阅读 2 调试技巧 2.1 打断点位置问题 2.2 增加调试代码 </

win10安装mysql8.0+汉化

一、官网安装 MySQL 1. 在mysql官网进行下载页面 2. 下滑页面&#xff0c;选择 MySQL community download 3.下载windows版本 4.选择第二个download 5.不用登陆&#xff0c;no thanks&#xff0c;just start my download. 6.下载 二、安装 1. 双击安装 2. 选 Full->next 3…

depcheck检查项目中未被使用的依赖

depcheck是一个用于分析项目中依赖项的工具&#xff0c;可以查看&#xff1a;每个依赖项是如何使用的&#xff0c;哪些依赖项是无用的&#xff0c;以及哪些依赖项在package.json 1、安装 npm install -g depcheck # 必须全局安装2、可配置文件.depcheckrc&#xff08;不配置 直…

开源模型应用落地-CodeQwen模型小试-集成langchain(四)

一、前言 通过学习代码专家模型&#xff0c;开发人员可以获得高效、准确和个性化的代码支持。这不仅可以提高工作效率&#xff0c;还可以在不同的技术环境中简化软件开发工作流程。代码专家模型的引入将为开发人员带来更多的机会去关注创造性的编程任务&#xff0c;从而推动软件…

kafka管理工具 kafka-ui 的 k8s 部署

背景 实际使用中&#xff0c;部署好kafka集群后&#xff0c;需要管理集群&#xff0c;那么一个好的web控制台就显得尤为重要了。 直接上部署代码&#xff0c;亲测可用 开源链接 https://github.com/provectus/kafka-ui 效果预览 部署 配置文件 kafka-ui-cm 注意&#x…

【轮转数组】力扣python

1.python切片 这里nums[:]代表列表 class Solution:def rotate(self, nums: List[int], k: int) -> None:nlen(nums)nums[:]nums[-k%n:]nums[:-k%n] 2.边pop边push 0代表插入的位置 class Solution:def rotate(self, nums: List[int], k: int) -> None:nlen(nums)fo…

搭建一个根据语义相似度进行文本去重服务

背景 1、在做大模型训练的时候&#xff0c;我们需要进行数据集的处理&#xff0c;而很多情况下我们收集到的数据集会存在重复数据&#xff0c;针对去重&#xff0c;有两种&#xff0c;一种是完全重复&#xff0c;也就是数据集里面有一个A&#xff0c;还有存在了着另外一个A&am…

花趣短视频源码淘宝客系统全开源版带直播带货带自营商城流量主小游戏功能介绍

1、首页仿抖音短视频 &#xff0c;关注 &#xff0c;我的 本地 直播 可发布短视频 可录制上传 2、商城页面 广告位、淘口令识别、微信登录、淘宝登录、淘宝返佣、拼多多返佣、京东返佣、唯品会返佣、热销榜、聚划算、天猫超市、9.9包邮、品牌特卖、新人攻略 、小米有品、优惠加…

不知摄像机网段IP地址?别担心,这里有解决之道

在数字化、智能化的今天&#xff0c;摄像机作为安全监控和日常记录的重要工具&#xff0c;其应用越来越广泛。然而&#xff0c;在实际使用中&#xff0c;我们可能会遇到一些问题&#xff0c;比如忘记了摄像机的网段IP地址&#xff0c;这往往会让我们感到头疼。那么&#xff0c;…

LearnOpenGL(十五)之深度测试

一、深度缓冲 深度缓冲就像颜色缓冲(Color Buffer)&#xff08;储存所有的片段颜色&#xff1a;视觉输出&#xff09;一样&#xff0c;在每个片段中储存了信息&#xff0c;并且&#xff08;通常&#xff09;和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的&a…

Linux操作系统基础题库

一. 单选题&#xff08;共2题&#xff0c;40分&#xff09; 1. (单选题)Linux操作系统自诞生至今&#xff0c;有数十万的程序开发人员参与到了它的开发与完善中&#xff0c;如今Linux已发展成为是一个成熟、稳定的操作系统。从以下选项中选出关于Linux特点描述完全正确的一项。…