gpt4 book ai didi

java - 从不同线程访问数据时丢失对象引用

转载 作者:行者123 更新时间:2023-11-30 05:45:54 25 4
gpt4 key购买 nike

很抱歉编写了整堆代码,但找不到文字来解释我的问题。

问题:GameHandler 创建 GameData 对象并将 this 作为 ITraceble 传递。GameData 对象具有 ITraceable 对象的引用。 GameTask 实现了 Runnable,因此它将在不同的线程上运行。但是,当我尝试从 GameTask 内的任何位置调用 m_gameData.traceMeNow() 时,我得到的 m_game.m_traceable 为 null。

public interface ITraceable {
public void trace(String a_args);
}

public class GameData {
ITraceable m_traceable;
public GameData(ITraceable a_traceable) {
m_traceable = a_traceable;
}

public void traceMeNow() {
m_traceable.trace("something to trace"); <----- m_traceable ref is NULL.
}
}

public class GameTask implements Runnable {
GameData m_gameData;
public GameTask(GameData a_gameData) {
m_gameData = a_gameData;
m_gameData.traceMeNow(); <---Function call from here
}

public void run() {
//something here
}
}

class GameHandler implements ITraceable {
public void trace(String a_args) {
//writting some logs here.
}

public void createObjects() { < ------ Creating objects here
GameData l_gameData = new GameData(this);
GameTask l_gameTask = new GameTask(l_gameData);
//--- Starting GameTask in other Thread ----//
}
}

最佳答案

声明变量final:

final ITraceable m_traceable;

这保证了所有线程都会看到分配的值(前提是对 this 的引用没有在构造函数中不安全地发布,但它不在这里)。

关于java - 从不同线程访问数据时丢失对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54843309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com