进程互斥模拟

 

一、实验目的:

通过编写进程互斥模拟程序,掌握Java中的Lock机制来实现进程互斥。

学习如何使用Lock来保证多个线程之间的互斥访问,避免资源竞争问题。

理解进程互斥的概念,以及如何使用Lock来实现互斥

 

实验设备与实验环境:

计算机,Java编译系统,idea,ChatGPT

 

二、实验程序设计内容:

模拟自习室预约问题,多个学生同时预约座位,但座位数量有限,需要保证预约过程的互斥性。

使用Lock来保证多个学生在预约座位时的互斥访问,避免多个学生同时预约同一个座位。

 

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

  1. 创建一个StudyRoomBookingSimulation类,表示自习室预约模拟程序,其中包括总座位数、可用座位数和一个ReentrantLock对象。
  2. 创建一个Student类实现Runnable接口,代表预约座位的学生,每个学生有一个名字。
  3. 在Student类的run方法中,使用lock()方法获取锁,确保只有一个线程可以访问共享资源。
  4. 学生预约座位时,先获取锁,然后判断是否还有可用座位,如果有则预约成功,可用座位数减一;预约结束后释放锁。
  5. 在主类中创建多个学生线程,并启动线程,观察学生们预约座位的过程。

 

四、实验源程序及注释:

package homework.os;

/**
 * Date:2024/4/22  11:30
 * Description:TODO
 *
 * @author Leon
 * @version 1.0
 */

import java.util.Scanner;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class exm5_StudyRoom {
    private static int totalSeats = 5;
    private static int availableSeats = totalSeats;
    private static Lock lock = new ReentrantLock();

    public static void main(String[] args) {
        System.out.println("输入学生数: ");
        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        for (int i = 1; i <= n; i++) {
            Runnable student = new Student("Student" + i);
            Thread thread = new Thread(student);
            thread.start();
        }
    }

    static class Student implements Runnable {
        private String name;

        public Student(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            if (availableSeats > 0) {
                lock.lock();
                try {
                    if (availableSeats > 0) {
                        System.out.println(name + "预约了一个座位");
                        availableSeats--;
                        System.out.println("剩余座位:" + availableSeats);
                    } else {
                        System.out.println("座位已经被预约完了");
                        System.exit(0);
                    }
                } finally {
                    lock.unlock();
                }
            } else {
                System.out.println(name + "没有预约到座位");
            }
        }
    }
}

 

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

输入学生数:

10

 

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

Student1预约了一个座位

剩余座位:4

Student4预约了一个座位

剩余座位:3

Student6预约了一个座位

剩余座位:2

Student8预约了一个座位

剩余座位:1

Student2预约了一个座位

剩余座位:0

座位已经被预约完了

 

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

通过这个实验,我深入理解了进程互斥的概念以及如何使用Lock来实现进程互斥。在多线程环境下,通过使用Lock机制,可以保证多个线程之间的互斥访问,避免资源竞争问题,确保程序的正确性和稳定性。编写这个模拟程序让我更加熟悉了Java中的Lock机制的使用方法,也加深了我对多线程编程的理解。

 

 

 

 

 

                

实验评价及结论:

 

(示例)

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

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

vⅤ_Leon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值