设为首页 收藏本站
查看: 336|回复: 0

[经验分享] 浅析Tomcat之LimitLatch

[复制链接]

尚未签到

发表于 2017-1-25 09:54:15 | 显示全部楼层 |阅读模式
Tomcat线程工具类中有个LimitLatch,这是一个锁存器类.它的作用就是在多线程的情况下控制并发.使用了java的多线程框架中的同步器AbstractQueuedSynchronizer.锁存器类主要用在接受连接的场景,从它的名字来看这是一个有限限制的锁存器.也就是可以控制最大的并非数.当超过这个并发数的时候就把当前请求并发执行的线程放入到等待队列中.待有释放线程时才按FIFO的方式执行等待队列中的线程.
LimitLatch的存在就能使请求到达Endpoint的时候可以在到达最大并发的时候进行等待,待有处理完的链接释放资源立刻按先进先出的规则进行链接的处理.它起到了控制并发和缓冲的作用.具体可以看下代码

public class LimitLatch
{
private class Sync extends AbstractQueuedSynchronizer
{
private static final long serialVersionUID = 1L;
public Sync()
{
}
@Override
protected int tryAcquireShared(int ignored)
{
long newCount = count.incrementAndGet();
if (!released && newCount > limit) {
// Limit exceeded
count.decrementAndGet();
return -1;
} else {
return 1;
}
}
@Override
protected boolean tryReleaseShared(int arg) {
count.decrementAndGet();
return true;
}
}
private final Sync sync;
private final AtomicLong count;
private volatile long limit;
private volatile boolean released = false;
/**
* Instantiates a LimitLatch object with an initial limit.
* @param limit - maximum number of concurrent acquisitions of this latch
*/
public LimitLatch(long limit) {
this.limit = limit;
this.count = new AtomicLong(0);
this.sync = new Sync();
}
/**
* Acquires a shared latch if one is available or waits for one if no shared
* latch is current available.
*/
public void countUpOrAwait() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
/**
* Releases a shared latch, making it available for another thread to use.
* @return the previous counter value
*/
public long countDown() {
sync.releaseShared(0);
long result = getCount();
return result;
}
/**
* Releases all waiting threads and causes the {@link #limit} to be ignored
* until {@link #reset()} is called.
*/
public boolean releaseAll() {
released = true;
return sync.releaseShared(0);
}
/**
* Resets the latch and initializes the shared acquisition counter to zero.
* @see #releaseAll()
*/
public void reset() {
this.count.set(0);
released = false;
}
/**
* Returns <code>true</code> if there is at least one thread waiting to
* acquire the shared lock, otherwise returns <code>false</code>.
*/
public boolean hasQueuedThreads() {
return sync.hasQueuedThreads();
}
/**
* Provide access to the list of threads waiting to acquire this limited
* shared latch.
*/
public Collection<thread> getQueuedThreads() {
return sync.getQueuedThreads();
}
}
   上面是该类的主要代码countUpOrAwait是获取锁,没有得到的话线程就进行等待.countDown是释放锁.这两个是最常使用的.从代码中我们也可以很清楚的看到这些功能均是依赖于它的一个内部类Sync,这个类继承了AbstractQueuedSynchronizer.这是一个典型的同步器的实现.其中等待线程的队列和挂起的规则都是在AbstractQueuedSynchronizer虚类里面实现的.AbstractQueuedSynchronizer为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁定和相关同步器(信号量,事件等等)提供一个框架.在AbstractQueuedSynchronizer的实现中有个内部类Node,它是挂起线程所存在的节点,其中挂起线程的内部结构就是这个Node组成的链表.有兴趣的话可以看下该类的源码,同时AbstractQueuedSynchronizer的API描述中也有这个类很详细的用法.Tomcat的LimitLatch只是使用中的一个典型场景.
 
 
首发于泛泛之辈 - http://www.lihongkun.com/archives/104

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-333173-1-1.html 上篇帖子: java-模拟tomcat服务器 下篇帖子: 浅析Tomcat之AbstractEndpoint
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表