2

Here is some code:

public class A {
  private volatile B b;

  public void methodC() {
    b.doSomething();
  }

  public void setB(B newB) {
    this.b = newB;
  }
}

'Thread 1' is executing b.doSomething() by executing methodC().

At the same time 'thread 2' set a new B object into 'b'.

My question is:

Could the object previously refereced by 'b' be garbage-collected although doSomething() method on it is still executing?

4

2 回答 2

7

不,因为为了调用成员函数,您需要引用该对象。因此,正在调用的线程b.doSomething()将持有一个引用,从而防止垃圾收集。

尽管在下面查看 Jon Harrop 的答案以了解何时b可能会出现这种情况GC

于 2012-04-18T13:13:02.907 回答
1

之前由“b”引用的对象是否可以被垃圾回收,尽管它的 doSomething() 方法仍在执行?

是的,先前由 'b' 引用的对象可能会被垃圾回收,即使其doSomething()上的方法仍在执行。

您可能希望this在执行其中一个方法时可以访问,因为方法隐式传递了this指针,并且您可能会假设它总是溢出到堆栈中。但是,许多优化可以改变这一点并this从 GC 看到的全局根集中删除。

例如,如果方法的主体以doSomething不需要this的代码结束并且方法是内联的,则this可能不会从寄存器溢出到堆栈,或者可能会覆盖其堆栈槽。this在任何一种情况下,即使执行仍在内部,GC 也将不再看到doSomething,因此this可能会被垃圾收集。

于 2013-07-11T22:19:43.320 回答