java并发-Semaphore(计数信号量)
2019-12-28 本文已影响0人
MJLDG
Semaphore,juc下的同步工具类,简称计数信号量。
常用于控制同时访问共享资源的线程数量,和Synchronized,ReentrantLock不同,
这些都是独占锁,每次只允许一条线程访问共享资源。
但是Semaphore却可以允许指定数量的线程同时进入共享资源。
public static void main(String[] args) {
//每次可以3条线程同时访问共享资源
Semaphore semaphore = new Semaphore(3);
int size = 9;
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 1; i <= size; i++) {
final int temp = i;
executorService.execute(() -> {
try {
semaphore.acquire();
System.err.println(Thread.currentThread().getName() + "---" + temp+"--"+ new Date());
Thread.sleep(1000L);
semaphore.release();
} catch (Exception e) {
e.printStackTrace();
}
});
}
executorService.shutdown();
}
输出如下
pool-1-thread-1---1--Fri Dec 27 17:35:44 CST 2019
pool-1-thread-2---2--Fri Dec 27 17:35:44 CST 2019
pool-1-thread-3---3--Fri Dec 27 17:35:44 CST 2019
pool-1-thread-5---5--Fri Dec 27 17:35:45 CST 2019
pool-1-thread-1---6--Fri Dec 27 17:35:45 CST 2019
pool-1-thread-4---4--Fri Dec 27 17:35:45 CST 2019
pool-1-thread-3---8--Fri Dec 27 17:35:46 CST 2019
pool-1-thread-2---7--Fri Dec 27 17:35:46 CST 2019
pool-1-thread-4---9--Fri Dec 27 17:35:46 CST 2019
通过分析也可以发现每次也最多只有三条线程同时访问。