# Semaphore基本使用
## 1.什么是 Semaphore(信号量)
- Semaphore是jdk1.5开始提供的并发包工具类
- Semaphore可以用来保护资源同时被多少个线程访问
- Semaphore也使用了AQS并发包
简单来讲就是 线程需要拿到 Semaphore 的permit 才可以继续执行,拿不到permit需要等待
## 2.方法说明
``` java
//构造方法, 设置semaphore的资源个数
Semaphore semaphore = new Semaphore(5);
//获取1个资源, 当资源不足时, 线程会挂起
public void acquire();
//获取指定个数的资源, 当资源不足时, 线程会挂起
public void acquire(int permits)
//释放1个资源,唤醒等待线程
public void release()
//释放指定个数的资源, 唤醒等待线程
public void release(int permits)
```
## 3. 实例演示
现在有5部公用电话和10个学生,模拟下学生正在排队打电话的情况
``` java
public static void main(String... args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), r -> {
Thread thread = new Thread(r);
thread.setName("count-down-thread-" + thread.getId());
return thread;
});
Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 8; i++) {
final int index = i;
threadPoolExecutor.execute(() -> {
try {
semaphore.acquire();
System.out.println(String.format("%s 号学生开始打电话....", index));
int computeResult = new Random().nextInt(10);
try {
Thread.sleep(computeResult * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println(String.format("%s 号学生挂了电话", index));
semaphore.release();
}
});
}
}
```
```
4 号学生开始打电话....
2 号学生开始打电话....
0 号学生开始打电话....
3 号学生开始打电话....
1 号学生开始打电话....
1 号学生挂了电话
5 号学生开始打电话....
2 号学生挂了电话
6 号学生开始打电话....
3 号学生挂了电话
7 号学生开始打电话....
5 号学生挂了电话
0 号学生挂了电话
4 号学生挂了电话
6 号学生挂了电话
7 号学生挂了电话
```
## 2.源码分析
``` java
```