Java Getter方法返回两个不同的对象标识hashcode
在一个项目中帮助一位朋友,我们试图调试一个问题,然后遇到了一个更令人费解的问题。我让一个线程通过getter方法获取某个变量的值,并每隔500毫秒打印它的identityHashCode。在Game类中更改变量之前,所有操作都正常。然后返回的identityHashCode开始在新对象和旧对象之间来回跳转。这是我以前从未见过的行为,我希望你们对正在发生的事情有任何建议甚至暗示 提前感谢,我附上部分源代码和控制台输出Java Getter方法返回两个不同的对象标识hashcode,java,multithreading,return,objectid,Java,Multithreading,Return,Objectid,在一个项目中帮助一位朋友,我们试图调试一个问题,然后遇到了一个更令人费解的问题。我让一个线程通过getter方法获取某个变量的值,并每隔500毫秒打印它的identityHashCode。在Game类中更改变量之前,所有操作都正常。然后返回的identityHashCode开始在新对象和旧对象之间来回跳转。这是我以前从未见过的行为,我希望你们对正在发生的事情有任何建议甚至暗示 提前感谢,我附上部分源代码和控制台输出 public GamePlayState(int sid) {
public GamePlayState(int sid) {
stateID = sid;
entityManager = StateBasedEntityManager.getInstance();
game = new Game(this);
//TEST CODE ONLY
Thread t = new Thread(this);
t.start();
}
/******TEST CODE ONLY******/
public synchronized void run () {
while (true) {
System.err.println(System.identityHashCode(game.getShootL()));
try {
wait(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出611581887
611581887
611581887
611581887
611581887
611581887
现在值已更改
1709366259
611581887
1709366259
611581887
1709366259
611581887
1709366259
到目前为止,我们还无法找到真正的答案,但是将getter方法返回的变量设置为静态可以消除这个问题。看起来底层第三方引擎正在处理对象变量 请注意,如果没有一个有效的解决方案,将很难帮助您。请记住,从多个线程访问的字段应该标记为volatile或手动同步。这么多不好的地方…你所说的Object IDSorry到底是什么意思?我指的是返回的布尔对象的identityHashCode