84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
java 有没有一种有固定大小的并发队列,在有新的元素插入的队尾的时候能自动判断如果队列满了就poll掉队头的元素,没满就offer进去?
ps:考虑过LinkedBlockingQueue和ConcurrentLinkedQueue
ConcurrentLinkedQueue可以用size()判断大小 LinkedBlockingQueue可以用offer()判断,如果塞不进去说明队列满了
但是效率都不太高(在判断队列是否满了的情况。。。) 而且由于E元素是业务bean,比较大,所以100并发时候大概到了300~400ms。。。。
求大神更优的解决方案。。。
认证高级PHP讲师
ArrayBlockingQueue 应该符合 LZ 的要求,但还是需要自己根据 offer 的返回值判断。
ConcurrentLinkedQueue 的 size 不是常量时间操作,所以慢。LinkedBlockingQueue 用链表实现的,而且也不是专门用于固定大小的队列,所以也慢。
简单一点的,ArrayBlockingQueue。
ArrayBlockingQueue
复杂一点的,特别是读线程远大于写线程的,用LMAX的RingBuffer。
RingBuffer
LinkedQueue慢是慢在每次插入删除元素都有四次指针操作,如果你大小固定,用array是最好的方法。
LinkedQueue
ArrayBlockingQueue 应该符合 LZ 的要求,但还是需要自己根据 offer 的返回值判断。
ConcurrentLinkedQueue 的 size 不是常量时间操作,所以慢。LinkedBlockingQueue 用链表实现的,而且也不是专门用于固定大小的队列,所以也慢。
简单一点的,
ArrayBlockingQueue
。复杂一点的,特别是读线程远大于写线程的,用LMAX的
RingBuffer
。LinkedQueue
慢是慢在每次插入删除元素都有四次指针操作,如果你大小固定,用array是最好的方法。