【问题标题】:Losing object reference when accessing data from different thread从不同线程访问数据时丢失对象引用
【发布时间】:2019-02-24 02:05:01
【问题描述】:

我很抱歉写了一大堆代码,但找不到词来解释我的问题。

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

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 ----// 
    }    
}

【问题讨论】:

  • l_gameTask 何时以及如何启动?

标签: java multithreading


【解决方案1】:

声明变量final:

final ITraceable m_traceable;

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

【讨论】:

  • 我不能声明为 final,因为我需要从构造函数中赋值。
  • @MicroEyes 在构造函数中赋值并不排除最终确定。
  • 谢谢。那行得通。实际上我在类本身和构造函数中分配了“final ITraceable m_traceable=null”,这给了我错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多