Java线程--Semaphore信号量

本文介绍了Java中的Semaphore信号量,包括其作为计数信号量的作用和使用方式。通过生产者消费者模型(产1消1模式)和停车场案例,详细阐述了Semaphore如何控制并发线程数和资源互斥访问。示例代码展示了Semaphore如何应用于实际场景,如限制并发生产和消费,以及管理停车场的车位占用情况。
摘要由CSDN通过智能技术生成

Semaphore信号量

目录

Semaphore信号量

示例1:生产者消费者----产1消1模式

产1消1:业务说明

示例2:多信号指示灯----停车场

停车场:业务说明


 


Semaphore是计数信号量。Semaphore可管理1个或多个许可证。

  • acquire()方法尝试获取一个许可证,如果没有获得到,当前线程阻塞,直至其它线程的release()方法释放出来一个许可证;
  • release()方法释放出来一个许可证;

Semaphore含义:有多少许可证,就能同时允许多少线程并行。这要看当前机器CPU的最大线程支持数N(理论上来说,程序上给与设定的最佳并发线程数为N+1)。信号量主要用于两个目的:一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。下面举例说明业务场景。 


示例1:生产者消费者----产1消1模式

产1消1:业务说明

  • 业务初始情况

原料若干,生产者1人,消费者1人,加工房1间(共享资源)。

  • 业务达到效果

生产者每加工出来一个原料,则消费者立马取走消费。

  • 业务注意事项

生产者和消费者不用共用一个信号指示灯,原因是由于并发性,有可能生产者总是能获得到许可证,疯狂的生产导致生产过剩,消费饥饿现象;也有可能消费者总是能获得到许可证,疯狂的消费导致消费过剩(其实啥都没消费到,因为还没生产呢),生产饥饿现象;所以,生产者/消费者的并发问题,我们在此启用一个生产信号指示灯,一个消费信号指示灯。生产者获得可生产的指示灯后,进行生产直至生产完毕,然后点亮消费信号指示灯使消费者具备资格进行消费。消费者获得可消费的指示灯后,进行消费直至消费完毕,然后点亮生产信号指示灯使生产者具备资格进行生产。

系统初始时,加工房共享资源是空闲着的,有硬性要求必须要先进行生产,然后才能消费。

  • 业务实现图示: 

生产者消费者示意图

  • 业务示例代码: 
/**
* Thread线程:代码结构的一般写法
* 业务类:包含共享资源以及共享资源的访问方法
* 任务:实现Runnable,一个任务代表一个业务类需要并发执行的业务方法

//业务类
class MyClass{
    private int n; //共享资源
    public void set(int n){
        this.n = n;
    }
    public int get(){
        return n;
    }
}

//任务
class MyTask implements Runnable{
    private Semaphore sem ;//同步器|锁
    private MyClass myObj; //业务类对象
    public MyTask(MyClass myObj, Semaphore sem){
        this.sem = sem;
        this.myObj = myObj;
    }
    
    public void run(){
        sem.acquire();     //获得锁
        myObj.yyyMethod(); //临界区:业
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值