我在下面的代码中声纳了声纳的不一致同步错误。
public int getMessageCount()
{
return m_messageCount;
}
public void onMessage(XQMessage msg) throws XQServiceException
{
synchronized(this)
{
m_messageCount--;
// add the message to the result
m_messages.add(msg);
if (m_messageCount == 0)
{
// wake up client
finished();
}
}
}
错误已开启"返回m_messageCount"。如果我使m_message易变,它会解决这个问题吗?
答案 0 :(得分:2)
由于您在修改synchronized(this)
时使用的是m_messageCount
,因此可以使用getMessageCount()
方法synchronized
来解决您的问题。
例如:
public synchronized int getMessageCount(){
return m_messageCount;
}
答案 1 :(得分:2)
@jameslarge你能否在单独的帖子中提出这个AtomicInteger建议
我在想,就像这样:
static final int INITIAL_MESSAGE_COUNT = ...;
AtomicInteger messageCount = new AtomicInteger(INITIAL_MESSAGE_COUNT);
public int getMessageCount()
{
return messageCount.get();
}
public void onMessage(XQMessage msg) throws XQServiceException
{
int mc = messageCount.decrementAndGet();
messages.add(msg);
if (mc == 0) wake_up_client();
}
注意:messages.add()
调用位于您的实施中的synchronized
块内。在我的版本中不再是这种情况。我不知道messages
究竟是什么,但如果您依靠synchronized块来保护它,则必须重新添加同步。此时您可能只需使用原始版本version:AtomicInteger比使用常规int
更复杂。我不会使用它,除非它允许我使用synchronized
块实现某些算法而不使用。
P.S。;如果在调用onMessage()时消息计数已经为零,应该会发生什么?这会发生吗?如果发生这种情况,您将收到负面消息计数。我没有足够的信息来了解这是好事还是坏事。
P.P.S .;那XQServiceException
怎么样?无论messages.add()
是否抛出异常,我们的两个实现都将减少消息计数。那可能不是你想要的。我不知道。