Java Apache Commons-CircularFifoBuffer BufferOverflowException 背景

Java Apache Commons-CircularFifoBuffer BufferOverflowException 背景,java,apache-commons,circular-buffer,Java,Apache Commons,Circular Buffer,我试图使用ApacheCommons库中的CircularFifoBuffer类,该类包含通过WebSocket连接接收的最近消息的集合。但是,当我在Linux部署中达到循环ifobuffer的大小限制时,将抛出缓冲溢出异常 我对Java还是相当陌生,但以下是我如何定义CircularFifoBuffer实例变量: private static Buffer<String> recentWebSocketMessages = new CircularFifoBuffer<Str

我试图使用ApacheCommons库中的
CircularFifoBuffer
类,该类包含通过WebSocket连接接收的最近消息的集合。但是,当我在Linux部署中达到
循环ifobuffer
的大小限制时,将抛出
缓冲溢出异常

我对Java还是相当陌生,但以下是我如何定义
CircularFifoBuffer
实例变量:

private static Buffer<String> recentWebSocketMessages = new CircularFifoBuffer<String>(1000);
奇怪的是,当我写一个无限循环时,这个问题是间歇性的:

while(true)
{
    recentWebSocketMessages.add("TESTING");
}
该异常没有发生(至少在Windows中-我还没有能够测试Linux)

问题 所以我想这里的主要问题是为什么这个问题是间歇性的,我可以通过定义静态变量来解决这个问题吗?(即使这将
最新WebSocketMessages
循环fifobuffer
实现的
边界fifobuffer
紧密耦合)

具有以下
recentWebSocketMessages
定义的相同代码不会引发
BufferOverflowException
,因为对缓冲区的访问是同步的,如API和Sorifend的回答中所述:

Buffer recentWebSocketMessages = BufferUtils.synchronizedBuffer(new CircularFifoBuffer(1000));

快速回答:不,像那样改变它不会真正有帮助

测试消息不会导致问题,因为应自动删除项目以添加空间:

CircularFifoBuffer是具有固定大小的先进先出缓冲区 如果已满,则替换其最旧的元素

CircularFifoBuffer的移除顺序基于插入顺序 秩序;元素的删除顺序与删除它们的顺序相同 补充。迭代顺序与删除顺序相同

然而,我相信,当您处于缓冲区限制时(在您的情况下为1000),为您的web套接字使用多个线程时,有时会出现问题

如果这是您的问题,那么解决它的最佳方法是如下同步:

Buffer recentWebSocketMessages=BufferUtils.synchronizedBuffer(新循环ifobuffer(1000))

而不是你现在怎么做:

Buffer recentWebSocketMessages=new CircularFifoBuffer(1000)


复制的表单API:

。。。很可能是你的问题,太好了。考虑到我的应用程序肯定是多线程的,这很可能是根本原因。不敢相信我没有考虑这个。谢谢你的详尽回答。
private static CircularFifoBuffer<String> recentWebSocketMessages = new CircularFifoBuffer<String>(1000);
while(true)
{
    new Thread(new Runnable() 
    {
        @Override
        public void run()
        {
            try 
            {
                recentWebSocketMessages.add("TESTING");
            } 
            catch(BufferOverflowException e) 
            {
                e.printStackTrace();
            }
        }
    }).start();
}
Buffer recentWebSocketMessages = BufferUtils.synchronizedBuffer(new CircularFifoBuffer(1000));