dromara / dynamic-tp

🔥🔥🔥轻量级动态线程池,内置监控告警功能,集成三方中间件线程池管理,基于主流配置中心(已支持Nacos、Apollo,Zookeeper、Consul、Etcd,可通过SPI自定义实现)。Lightweight dynamic threadpool, with monitoring and alarming functions, base on popular config centers (already support Nacos、Apollo、Zookeeper、Consul, can be customized through SPI).
https://dynamictp.cn
Apache License 2.0
3.77k stars 763 forks source link

[ISSUE #191] VariableLinkedBlockingQueue的take、poll方法优化 #430

Open xingyiteng opened 3 months ago

xingyiteng commented 3 months ago

issue:#191 VariableLinkedBlockingQueue中的take、poll方法优化 原VariableLinkedBlockingQueue中take、poll方法代码:

if (c >= capacity) {
    signalNotFull();
}

修改后take、poll方法代码:

if (c == capacity) {
    signalNotFull();
}

原因:

  1. c 的含义是:在取出元素之前队列中的元素数量。参考代码:c = count.getAndDecrement();
  2. c == capacity 的含义是:如果取出元素之前,元素数量等于队列容量,那么在取出元素之后会有一个空位,则可以通知等待put操作的线程插入元素。
  3. c > capacity 的含义是:如果取出元素之前,元素数量大于队列容量,那么在取出元素之后依然没有空位,如果此时通知等待put操作的线程,则put操作依然失败。参考代码:while (count.get() >= capacity) {notFull.await();}

优化:

  1. 改为c == capacity,在高并发场景下,减少不必要的线程状态切换。
KamToHung commented 3 months ago
if (c >= capacity)

如果c > capacity的时候signal not full确实有点不合理