在Java中,没有指向对象的引用,但是此对象的方法之一仍在调用堆栈上。垃圾回收器是否有可能在从调用堆栈弹出其方法之前删除该对象,还是等待直到该方法弹出?(请在下面参考我的具体问题)
简单的单链表的实现:
public class LIST
{
private LIST_ELEMENT begin = new END();
// some methods to add or remove elements
public void clear()
{
begin = new END();
}
public void insertSorted(DATA_ELEMENT dataNew)
{
begin = begin.insertSorted(dataNew);
}
public void sort()
{
begin.sort(this);
}
}
public abstract class LIST_ELEMENT
{
public abstract LIST_ELEMENT insertSorted(DATA_ELEMENT dataNew);
public abstract void sort(LIST list);
}
public class END extends LIST_ELEMENT
{
@Override
public LIST_ELEMENT insertSorted(DATA_ELEMENT dataNew)
{
return new NODE(this, dataNew);
}
@Override
public void sort(LIST list)
{
list.clear();
}
}
public class NODE extends LIST_ELEMENT
{
private LIST_ELEMENT next;
private DATA_ELEMENT data;
public NODE(LIST_ELEMENT nextNew, DATA_ELEMENT dataNew)
{
next = nextNew;
data = dataNew;
}
@Override
public LIST_ELEMENT insertSorted(DATA_ELEMENT dataNew)
{
if(data.isSmallerThan(dataNew))
{
next = next.insertSorted(dataNew);
return this;
}
else
{
return new NODE(this, dataNew);
}
}
@Override
public void sort(LIST list)
{
next.sort(list);
list.insertSorted(data);
}
}
public interface DATA_ELEMENT
{
public boolean isSmallerThan(DATA_ELEMENT dataCompare);
}
已经实现了这种排序算法,是否安全?清除列表后,垃圾收集器能否从NODE对象中删除数据(因此调用list.insertSorted(data);
发生意外情况),还是调用堆栈上的方法算作对对象的引用,以使data属性在LIST.sort调用的整个过程中都有效?是否保证在此期间不删除对象?
在我的测试中,对LIST.sort的调用总是按预期对列表进行排序。
在Java中,没有指向对象的引用,但其中之一是 该对象的方法仍在调用堆栈上。
这不可能发生。如果某个方法正在运行,则引用其方法被调用的对象。
垃圾回收器是否有可能在删除对象之前 它的方法从调用堆栈中弹出,或者等待直到 方法弹出?
只要方法正在运行,就存在对该对象的引用。这就是为什么无法删除此类对象的原因。