Semaphore学习

前言

初入职场,目前正在学习中,工作中遇到了一个不认识的类,网上找了很多材料,特此来总结一下。

Semaphore

Semaphore负责协调各个线程。
以停车场为例, 假设停车场有三个车位,一开始三个车位都是空的。这时一下来了5辆车,看门人允许其中三辆车不受阻碍地进去,然后放下车栏,剩下的车辆则在入口等待,此后来的车辆也得在入口等待。直到停车场开出一辆,看门人放入一辆,停车场开出两辆,看门人放入两辆,如此类推。
在这里,车位是公共资源,看门人就是信号量,而每辆车是一个线程。
Semaphore 可以看做是一个信号的集合。不同的线程能够从 Semaphore 中获取若干个信号量。当 Semaphore 对象持有的信号量不足时,尝试从 Semaphore 中获取信号的线程将会阻塞。直到其他线程将信号量释放以后,阻塞的线程会被唤醒,重新尝试获取信号量。

信号量特性

  1. 信号量是一个非负整数(车位数),所有通过它的线程(车辆)都会将该整数减一(通过它当然是为了使用资源);
  2. 当该整数值为零时,所有试图通过它的线程都将处于等待状态。 在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。
  3. 当一个线程调用Wait(等待)操作时,它要么通过然后将信号量减一,要么一直等下去,直到信号量大于一或超时。
  4. Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为加操作实际上是释放了由信号量守护的资源。

使用

Semaphore(int permits)
创建具有给定的许可数和非公平的公平设置的 Semaphore。
Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的 Semaphore。
permits - 初始的可用许可数目。此值可能为负数,在这种情况下,必须在授予任何获取前进行释放。
fair - 如果此信号量保证在争用时按先进先出的顺序授予许可,则为 true;否则为 false。
void acquire()
从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。
void acquire(int permits)
从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,或者线程已被中断。
void acquireUninterruptibly()
从此信号量中获取许可,在有可用的许可前将其阻塞。
void acquireUninterruptibly(int permits)
从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。
int availablePermits()
返回此信号量中当前可用的许可数。
void release()
释放一个许可,将其返回给信号量。
void release(int permits)
释放给定数目的许可,将其返回到信号量。
String toString()
返回标识此信号量的字符串,以及信号量的状态。

优点

控制线程的数量,不会超过范围

缺点

当线程死锁时,永远没办法释放,导致一直阻塞

这些让我初步了解了Semaphore这个类,但是我在代码中看到的问题,还是没有太明白。
源码:

private Semaphore semaphore = new Semaphore(0);

后来在进行查询,发现原来是这个意思,往下看:

private Semaphore canProduceCount = new Semaphore(10);
通过调用acquire,减少permit数目

private Semaphore canConsumerCount = new Semaphore(0);
通过调用release,增加permit数目

这个类一开始就是阻塞的,直到释放,许可数才会增加。
这就是我对它的全部理解,欢迎指正~~~
下面的链接就是我查询的资料啦~~~
[1]:https://baike.baidu.com/item/semaphore/1322231?fr=aladdin
[2]:https://www.cnblogs.com/leodaxin/p/7703721.html)
[3]:https://blog.csdn.net/carson0408/article/details/79475723

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值