0

我正在尝试创建一个聊天客户端,我正在从 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); 然后布尔值将由于某种原因被更新,它也将等于它的含义。

我以前从未遇到过这个错误,这对我来说非常奇怪,所以我希望有人能提供帮助。

4

1 回答 1

0

您似乎没有同步访问您的 boolean flag messageReadprintln碰巧为您做到了,因此您观察到了什么。

您可以通过标记 volatile 来解决您的问题:

private volatile boolean messageRead;

这将确保您在一个线程中所做的更改在另一个线程中是可见的,而无需同步您的代码。

于 2012-12-09T18:31:49.407 回答