我可能弄错了,但您可以使用 an ArrayList
,因为您不需要从队列中轮询每个元素。当数组的大小达到限制并且您需要发送它时,您只需在同步部分中刷新(创建副本并清除)您的数组。添加到这个列表也应该同步到这个刷新操作。
交换你的数组可能不安全——如果你的发送速度比你的生成速度慢,缓冲区可能很快就会开始相互覆盖。每秒 20000 个元素的数组分配对于 GC 来说几乎是微不足道的。
Object lock = new Object();
List list = ...;
synchronized(lock){
list.add();
}
...
// this check outside is a quick dirty check for performance,
// it's not valid out of the sync block
// this first check is less than nano-second and will filter out 99.9%
// `synchronized(lock)` sections
if(list.size() > 1000){
synchronized(lock){ // this should be less than a microsecond
if(list.size() > 1000){ // this one is valid
// make sure this is async (i.e. saved in a separate thread) or <1ms
// new array allocation must be the slowest part here
sendAsyncInASeparateThread(new ArrayList(list));
list.clear();
}
}
}
更新
考虑到发送是异步的,这里最慢的部分new ArrayList(list)
应该是 1000 个元素的大约 1 微秒和每秒 20 微秒。我没有测量,我从大约 1 毫秒内分配 100 万个元素的比例解决了这个问题。
如果你仍然需要一个超快的同步队列,你可能想看看MentaQueue