LimitLatch是一个共享性质的锁,这里的共享概念来自于AQS,指的是不同的线程可以同时获取该锁。本文开始之前,首先我要纠正之前的文章《面试官:谈一谈java中基于AQS的并发锁原理》的一个错误,LimitLatch并不是JDK实现的,而是tomcat实现的。
LimitLatch简介
jdk中对AQS的扩展有一个CountDownLatch,Latch是一个阀门的意思,CountDownLatch创建了一个阀门,之后阻塞,等待所有线程都执行结束并且countdown之后,才会继续执行。而本文要介绍的LimitLatch则更像是java中的Semaphore,用于控制资源的使用。
下面我们看一下LimitLatch中锁的实现:
private class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 1L; public Sync() {
} @Override protected int tryAcquireShared(int ignored) {
long newCount = count.incrementAndGet();//定义了AtomicLong类型的count数量,每次获取锁之后会加1 if (!released && newCount > limit) {
//是否超过limit的限制 // Limit exceeded count.decrementAndGet();//获取失败后减1 return -1;//返回-1代表获取锁失败,这是就只能进入队列了 } else {
return 1; } } @Override protected boolean tryReleaseShared(int arg) {
count.