我正在尝试创建一个聊天客户端,我正在从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);然后由于某种原因,布尔值将被更新,它也将等于它的含义。
我之前从未遇到过这个错误,对我来说非常奇怪,所以我希望有人可以提供帮助。
答案 0 :(得分:0)
您似乎没有同步访问布尔标志messageRead
。 println
碰巧为你做了这件事,因此你所观察到的。
你可以通过判断标志volatile来解决你的问题:
private volatile boolean messageRead;
这将确保您在一个线程中所做的更改在另一个线程中可见,而无需同步您的代码。