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是最好的方法。