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对象状态,它将获得更新的状态?我的意思是,缓存对象状态是在创建线程时完成的,还是在线程第一次读取对象状态并成功读取后完成的?