84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
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是最好的方法。