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