# Semaphore
信号量,用来限制能同时访问共享资源的线程上限。
# Semaphore应用
- 使用Semaphore限流,在访问高峰期时,让请求线程阻塞,高峰期过去再释放许可,当然它只适合限制单机线程数量,并且仅是限制线程数,而不是限制资源数(例如连接数,请对比Tomcat LimitLatch的实现)
import lombok.extern.slf4j.Slf4j;
import java.util.Random;
import java.util.concurrent.*;
@Slf4j
public class SemaphoreTest {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
semaphore.acquire();
log.info("{} get lock", Thread.currentThread().getName());
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
try {
int sleepTime = new Random().nextInt(5);
log.info("sleep time :{}", sleepTime);
TimeUnit.SECONDS.sleep(sleepTime);
log.info(Thread.currentThread().getName() + "start");
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
semaphore.release();
log.info("{} unlock", Thread.currentThread().getName());
}
}).start();
}
}
}