Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。它的用法如下:
availablePermits函数用来获取当前可用的资源数量
wc.acquire(); //申请资源
wc.release();// 释放资源
package com.zl.thread;
import java.util.Random;
import java.util.concurrent.Semaphore;
/**
* @author zhanglei
* @description : Semaphore 加锁减锁案例
* @date 2021/4/6$ 11:19$
* @return $
*/
public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore sp = new Semaphore(3); //表示同时只能有3个资源可用
for(int i = 1;i< 11;i++){
new TestThread(sp,"第"+i+"个人").start();
}
}
}
class TestThread extends Thread{
Semaphore wc;
String name;
TestThread(Semaphore wc,String name){
this.wc = wc;
this.name = name;
}
@Override
public void run() {
int availablePermits = wc.availablePermits();//获取当前能使用的资源
if(availablePermits > 0){
//表示还有资源可用
System.out.println(name+",当前有资源可用");
}else{
//无资源可用
System.out.println(name + ",当前无资源可用");
}
try {
wc.acquire(); //申请资源,没获取到就阻塞线程,一直等到获取到资源
System.out.println(name+",开始wc");
Thread.sleep(new Random().nextInt(1000)); // 模拟上厕所时间。
System.out.println(name+",wc结束");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
wc.release();//释放资源
}
}
}