Проблема с Java логическим

Я пытаюсь создать клиент чата, я возвращаю сообщение из javaSpace, затем устанавливаем newMessage = true; Таким образом, клиент может видеть, что есть новое сообщение, которое необходимо прочитать.

public void notify(RemoteEvent ev) 
{
    try 
    {
        messageRead = false;
        QueueItem qiTemplate = new QueueItem();
        newMessage = (QueueItem)space.take(qiTemplate,null,Long.MAX_VALUE);
        System.out.println(newMessage.getSender().getName()+ ": " + newMessage.getContent());
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}

Тогда для клиента,

while(true)
{
    try 
    {
        boolean temp  = _manager.messageRead;
        //System.out.println(temp);
        if(!temp)
        {
            QueueItem nextJob = _manager.newMessage;
            String nextJobNumber = nextJob.getSender().getName();
            String nextJobName = nextJob.getContent();
            System.out.println(nextJob.getSender().getName()+ ": " + nextJob.getContent());
            jobList.append( nextJobNumber + " : " + nextJobName + "\n" );

            _manager.messageRead = true;
        }



    }  catch ( Exception e) 
    {
        e.printStackTrace();
    }
}

Это прямо сейчас ВСЕГДА возвратит _messager.messageRead, чтобы быть истинным, даже если я только установил его слишком ложным. Если я раскомментирую //System.out.println(temp); тогда логическое значение по какой-то причине будет обновлено и будет равно значению.

Я никогда раньше не сталкивался с этой ошибкой, и она очень странная для меня, поэтому я надеюсь, что кто-то может помочь.

1 ответ

Похоже, у вас нет синхронизированного доступа к вашему логическому флагу messageRead, println случается сделать это для вас отсюда то, что вы наблюдаете.

Вы могли бы, вероятно, решить вашу проблему, сняв флажок volatile:

private volatile boolean messageRead;

Это гарантирует, что изменения, которые вы делаете в одном потоке, видны из другого потока без необходимости синхронизации вашего кода.

Другие вопросы по тегам