hooyantsing's Blog

17_Semaphore

字数统计: 250阅读时长: 1 min
2020/08/27

17 Semaphore

狂神说Java JUC并发编程最新版通俗易懂

Semaphore 信号量

多个共享资源互斥使用,并发限流,控制最大线程数目。

如果说 互斥锁 在同一时间仅让一个线程执行,那么 Semaphore 在同一时间仅让指定数量的线程并行执行,多余的等待,等待正在执行的线程执行完毕。

semaphore.acquire() 获得,假设已经满了,等待,等待有空位为止。

semaphore.release() 释放,会将当前的信号量释放 +1,然后唤醒等待线程。

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package add;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);

for (int i = 0; i < 6; i++) {
new Thread(
() -> {
try {
// acquire() 得到
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "抢到车位");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName() + "离开车位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// release() 释放
semaphore.release();
}
},String.valueOf(i)
).start();
}
}
}

运行结果:

CATALOG
  1. 1. 17 Semaphore
    1. 1.1. Semaphore 信号量
      1. 1.1.1. 案例