Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Getter方法返回两个不同的对象标识hashcode_Java_Multithreading_Return_Objectid - Fatal编程技术网

Java Getter方法返回两个不同的对象标识hashcode

Java Getter方法返回两个不同的对象标识hashcode,java,multithreading,return,objectid,Java,Multithreading,Return,Objectid,在一个项目中帮助一位朋友,我们试图调试一个问题,然后遇到了一个更令人费解的问题。我让一个线程通过getter方法获取某个变量的值,并每隔500毫秒打印它的identityHashCode。在Game类中更改变量之前,所有操作都正常。然后返回的identityHashCode开始在新对象和旧对象之间来回跳转。这是我以前从未见过的行为,我希望你们对正在发生的事情有任何建议甚至暗示 提前感谢,我附上部分源代码和控制台输出 public GamePlayState(int sid) {

在一个项目中帮助一位朋友,我们试图调试一个问题,然后遇到了一个更令人费解的问题。我让一个线程通过getter方法获取某个变量的值,并每隔500毫秒打印它的identityHashCode。在Game类中更改变量之前,所有操作都正常。然后返回的identityHashCode开始在新对象和旧对象之间来回跳转。这是我以前从未见过的行为,我希望你们对正在发生的事情有任何建议甚至暗示

提前感谢,我附上部分源代码和控制台输出

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