背景
私はWebSocketの接続を介して受け取った最近のメッセージのコレクションが含まれているApacheのCommonsのライブラリからCircularFifoBuffer
クラスを使用しようとしています。しかし、LinuxデプロイメントでCircularFifoBuffer
のサイズ制限に達すると、BufferOverflowException
がスローされています。のApache Commonsの - CircularFifoBuffer BufferOverflowException
私はまだJavaのにかなり新しいですが、ここで私はCircularFifoBuffer
インスタンス変数を定義しています方法は次のとおりです。
private static Buffer<String> recentWebSocketMessages = new CircularFifoBuffer<String>(1000);
そして、ここでは例外です:
org.apache.commons.collections15.BufferOverflowException: The buffer cannot hold more than 1000 objects.
at org.apache.commons.collections15.buffer.BoundedFifoBuffer.add(BoundedFifoBuffer.java:218)
at org.apache.commons.collections15.buffer.CircularFifoBuffer.add(CircularFifoBuffer.java:94)
at com.example.SystemMonitor.putRecentWebSocketMessage(SystemMonitor.java:228)
私には奇妙な何この問題がされています間欠的に、無限ループを書くとき:
while(true)
{
recentWebSocketMessages.add("TESTING");
}
例外で発生していない - だから私はこの問題は断続的であると私は解決することができ、なぜここでの主な問題はあると思います(少なくとも、Windowsで、私はまだLinuxのをテストすることができていない)
質問
を代わりに静的変数をそのように定義することで(この緊密カップルBoundedFifoBuffer
のCircularFifoBuffer
実装とrecentWebSocketMessages
にもかかわらず)
private static CircularFifoBuffer<String> recentWebSocketMessages = new CircularFifoBuffer<String>(1000);
編集
はありがとうは、この実装は同期化されていないという単純な事実を指摘しsorifiendとトム。興味のある方のために、以下のこの単純なスレッドの例では、マルチスレッドの問題であると同時に、バッファにアクセスする複数のスレッドが/ BufferOverflowException
は(バッファの私の元の定義で)発生する原因となりますことを証明している:
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));
[* "この実装は同期されていません。" *] /CircularFifoBuffer.html)...おそらくあなたの問題です。 – Tom