Java并发面试题, 什么是 Java 的 Semaphore?
Java并发面试题, 什么是 Java 的 Semaphore?
QA
Step 1
Q:: 什么是 Java 的 Semaphore?
A:: Java 的 Semaphore 是一种同步工具,用来控制同时访问某特定资源的线程数量。它允许多个线程同时访问一组资源,但控制同时访问的线程数目,通过 acquire() 和 release()
方法来实现资源的获取和释放。
Step 2
Q:: Semaphore 的构造方法有哪些?
A:: Semaphore 的构造方法主要有两个:Semaphore(int permits) 和 Semaphore(int permits, boolean fair)。第一个构造方法创建一个指定许可数量的非公平信号量,第二个构造方法可以指定公平性,若 fair 参数为 true,则信号量会按照 FIFO (先到先得)
原则处理线程的请求。
Step 3
Q:: 如何使用 Semaphore 实现限流?
A:: 限流是通过控制并发量来防止系统过载的一种方式。Semaphore 可以通过指定同时允许访问的最大线程数来实现限流。例如,创建一个 Semaphore(5) 对象,表示最多允许 5 个线程同时访问某个资源。每个线程在访问资源前调用 acquire() 方法,在访问后调用 release()
方法,从而控制并发数量。
Step 4
Q:: Semaphore 和 ReentrantLock 的区别是什么?
A:: Semaphore 和 ReentrantLock 都可以用于线程同步,但它们有以下区别:1. Semaphore 控制的是访问资源的线程数量,可以同时允许多个线程访问;而 ReentrantLock 仅允许一个线程持有锁。2. Semaphore 提供的 acquire() 和 release() 方法可以用于限流;而 ReentrantLock 提供的是独占锁。3.
Semaphore 可以用来实现资源池;而 ReentrantLock 则更多用于保护单个资源的独占访问。
Step 5
Q:: Semaphore 的公平模式和非公平模式有什么区别?
A:: 公平模式 (fair) 和非公平模式 (non-fair) 是 Semaphore 两种工作模式。公平模式下,线程会按照 FIFO (先到先得)
顺序获得许可;非公平模式下,线程获取许可的顺序是随机的,可能会导致某些线程长期等待。