Skip to content

Conversation

@xingyiteng
Copy link
Contributor

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,在高并发场景下,减少不必要的线程状态切换。
fix:VariableLinkedBlockingQueue的take、poll方法优化
@KamToHung
Copy link
Collaborator

if (c >= capacity)

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants