Java 同一对象根据线程的不同保持不同的状态
在调试我的应用程序时,此类中有一个对象(只有一个):Java 同一对象根据线程的不同保持不同的状态,java,spring-boot,object,concurrency,Java,Spring Boot,Object,Concurrency,在调试我的应用程序时,此类中有一个对象(只有一个): public class MqttInterface implements MqttPlatformInterfaceObserver{ private MqttMessage lastMessage; .... public MqttMessage getLastMessage() { return lastMessage; } @Override pu
public class MqttInterface implements MqttPlatformInterfaceObserver{
private MqttMessage lastMessage;
....
public MqttMessage getLastMessage() {
return lastMessage;
}
@Override
public void mqttMessageArrived(String message) {
try {
lastMessage = new JSONParser().parseJsonBodyAs(MqttMessage.class, message);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
void mqttMessageArrived(String)
方法是使用观察者设计模式实现的,因此在新消息到达时注册并通知对象
在应用程序运行一段时间后的某个时间点上,我有两个断点(每个方法体中有一个断点),当getLasMessage()
消息传递给对象时,它返回一个旧状态的lastMessage
对象。尽管后来多次调用了mqttMessageArrived(String)
,但是getLastMessage()
方法返回的lastMessage
对象保持不变,并且从不更新
我检查mqttMessageArrived
方法是否正在更新lastMessage
属性(没有引发Exception
),实际上,当程序停止在mqttMessageArrived
方法中时,因为断点,我看到lastMessage
状态正在更新,但在这之后,当程序在getLastMessage method()
中停止时,它具有相同的旧状态
我不明白同一个对象如何可能出现这种行为,我一直认为这与某些并发或缓存问题有关。可能会使cariable
易失性
?我认为您在这里遇到了内存可见性问题,使用volatile关键字作为lastMessage可能会有所帮助。这里有一些关于oracle原子访问的阅读:现在我了解了一些volatile关键字,我想知道我是否有一个web应用程序,每个请求都在不同的线程中执行,如果一个线程修改一个对象状态,线程结束,另一个线程启动(在第一个线程结束后)并读取get对象状态,它将获得更新的状态?我的意思是,缓存对象状态是在创建线程时完成的,或者在线程第一次读取对象状态并成功读取后完成的?可能会使cariable变为volatile
?我认为您在这里遇到了内存可见性问题,使用volatile关键字作为lastMessage可能会有所帮助。这里有一些关于oracle原子访问的阅读:现在我了解了一些volatile关键字,我想知道我是否有一个web应用程序,每个请求都在不同的线程中执行,如果一个线程修改一个对象状态,线程结束,另一个线程启动(在第一个线程结束后)并读取get对象状态,它将获得更新的状态?我的意思是,缓存对象状态是在创建线程时完成的,还是在线程第一次读取对象状态并成功读取后完成的?