Java中具有多个线程的对象的指针

时间:2011-01-17 20:26:41

标签: java multithreading pointers

我有两个主题。一个线程有一个myObjectManager实例。 myObjectManager有一个对象列表,以及一个检索对象的方法(public myObjectClass getObjectById(int ID))

我需要第一个线程来渲染myObjectManagers对象列表中的对象,第二个线程来执行游戏逻辑并移动它等等。

这就是我试过的

//thread 1:
m = myObjectManager.getObjectById(100);
m.render();

//thread 2:
m = myObjectManager.getObjectById(100);
m.rotate( m.getRotation() + 5 ); //increment rotation value

但是,似乎线程1具有没有更新旋转的对象实例。当我运行它时,渲染的对象不会旋转,但是当我使第二个线程打印出旋转值时,它会旋转。

在C ++中,我只是让函数getObjectById()返回一个指向myObjectClass实例的指针,但是当我说“return myInstance;”时,我不确定java究竟是做什么的。 我如何在java中做类似的事情?

抱歉,我是这种语言的新手!

6 个答案:

答案 0 :(得分:4)

在Java中,所有Object变量都是“指针”(或“引用”,正如人们通常所说)。问题必须在其他地方。我的猜测是线程1已经在线程2修改它之前渲染了对象。

编辑:另一种理论:后续的render()操作实际上并没有改变屏幕显示。旋转值更新得很好 - 但它不会反映到显示器上。

答案 1 :(得分:3)

引用(指针)没问题,但在Java中,每个线程都允许创建对象的本地副本(将其视为缓存),除非它们以某种方式同步,由一个线程进行更改另一方可能看不到。

This教程有望提供帮助。

答案 2 :(得分:2)

你有2个潜在的问题,这两个问题都在不同的答案中说明了。

  1. 你没有任何指示 控制你的线程的顺序 操作。因此渲染 可能在旋转之前发生 更新。这假定了 所涉及的课程实际上是 线程安全,并将表现为 预期。
  2. 如果课程不是     线程安全(即同步)     某种方式),然后更新     可能永远不会看到旋转线程     渲染线程。
  3. 要确定我们必须查看 m 类的来源。另外,如果getObjectById()也不是线程安全的话,你可能会遇到问题。

答案 3 :(得分:1)

尝试将对象中的rotation变量标记为volatile

答案 4 :(得分:0)

Java中的所有对象都通过引用传递 编写那些你不想做的事情的代码是不可能的。

你的第一个线程可能在第二个线程之前运行。

答案 5 :(得分:0)

Java中的所有对象引用,就像你的m变量一样,实际上是指针

因此,在您的示例中,两个m变量都指向同一个对象。