自定义同步器实现
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class CustomSemaphore {
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
private int permits;
public CustomSemaphore(int initialPermits) {
if (initialPermits < 0) {
throw new IllegalArgumentException("Initial permits cannot be negative");
}
this.permits = initialPermits;
}
public void acquire() throws InterruptedException {
lock.lock();
try {
while (permits <= 0) {
condition.await();
}
permits--;
} finally {
lock.unlock();
}
}
public void release() {
lock.lock();
try {
permits++;
condition.signal();
} finally {
lock.unlock();
}
}
}
关键要点
- 锁机制:使用
ReentrantLock
来保证对共享资源(许可数量permits
)的线程安全访问。ReentrantLock
提供了可重入的特性,并且可以替代synchronized
关键字,提供更灵活的锁控制。
- 条件变量:通过
lock.newCondition()
创建Condition
对象,用于线程的等待和唤醒。当许可数量不足时,线程通过condition.await()
进入等待状态,当有许可被释放时,通过condition.signal()
唤醒等待队列中的一个线程。
- 许可数量控制:使用一个整型变量
permits
来表示当前可用的许可数量。在acquire
方法中,当许可数量大于0时,线程获取许可并将permits
减1;在release
方法中,每次释放许可时将permits
加1。
- 异常处理:在
acquire
方法中,由于await
方法会抛出InterruptedException
,所以需要在方法声明中抛出该异常,或者在方法内部进行处理。这样可以确保在等待过程中如果线程被中断,能够及时做出响应。