使变量volatile变得无效:多线程正确性 - 同步不一致

时间:2015-04-08 21:32:11

标签: java multithreading sonarqube

我在下面的代码中声纳了声纳的不一致同步错误。

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易变,它会解决这个问题吗?

2 个答案:

答案 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()是否抛出异常,我们的两个实现都将减少消息计数。那可能不是你想要的。我不知道。