Java的信号量Semaphore

本文通过实例介绍如何利用信号量解决资源竞争问题。信号量是一种同步机制,用于多个进程访问同一资源时避免冲突。文中演示了10个学生共享3台电脑的场景,通过信号量确保同时最多只有3名学生能使用电脑。

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

Semaphore 表示信号量,在Linux的信号量的出现是为了解决共享资源竞争的问题。
其核心概念是:

当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用。大于0,资源可以请求,等于0,无资源可用,进程会进入睡眠状态直至资源可用。
当进程不再使用一个信号量控制的共享资源时,信号量的值+1,表示释放资源,其它进程就可以使用。

举例:

public class SemaphoreTest {

    public static void main(String[] args) {
        // 使用信号量来表示资源。比如现在有3台电脑,有10个学生用。
        int N = 10; // 学生数
        int C = 3; // 电脑数

        Semaphore semaphore = new Semaphore(C);

        for(int i = 0; i < N; i++) {
             new Student(i, semaphore).start();
        }
    }
}
public class Student extends Thread{

    private Semaphore semaphore;
    private int i;

    public Student(int i, Semaphore semaphore) {
        this.semaphore = semaphore;
        this.i = i; 
    }

    @Override
    public void run() {
        try {
            semaphore.acquire();
            System.out.println("学生" + i + "正在使用电脑..");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("学生" + i + "已经使用完电脑..");
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

学生0正在使用电脑..
学生1正在使用电脑..
学生2正在使用电脑..
学生0已经使用完电脑..
学生2已经使用完电脑..
学生1已经使用完电脑..
学生4正在使用电脑..
学生3正在使用电脑..
学生5正在使用电脑..
学生4已经使用完电脑..
学生5已经使用完电脑..
学生3已经使用完电脑..
学生7正在使用电脑..
学生6正在使用电脑..
学生8正在使用电脑..
学生7已经使用完电脑..
学生6已经使用完电脑..
学生9正在使用电脑..
学生8已经使用完电脑..
学生9已经使用完电脑..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值