大家都知道,在继承中,不共享变量时,Java类对象initialize的顺序和cleanup的顺序相反,但是共享变量时情况就比较复杂了,这时使用一个final变量跟踪引用是一个好方法,可以清楚地看到对象的initialize和cleanup情况:
class Shared{
private int refcount = 0;
private static long counter = 0;
private final long id = counter++;
public Shared ()
{
System.out.println(" Creating" + this);
}
public void addRef()
{
refcount++;
}
protected void dispose()
{
if (--refcount == 0)
System.out.println("Disposing " + this);
}
public String toString()
{
return ("Shared " + id);
}
protected void finalize() {
if(refcount != 0)
System.out.println("Error: object is not properly cleaned-up!");
}
}
class Composing{
private Shared shared;
private static long counter = 0;
private final long id = counter++;
public Composing(Shared shared)
{
System.out.println("Creating " + this);
this.shared = shared;
this.shared.addRef();
}
protected void dispose()
{
System.out.println("disposing " + this);
shared.dispose();
}
public String toString()
{
return ("Composing " + id );
}
}
public class ReferenceCounting {
public static void main(String[] args) {
// TODO Auto-generated method stub
Shared shared = new Shared();
Composing[] composing = {new Composing(shared),new Composing(shared),new Composing(shared),new Composing(shared)
,new Composing(shared)};
for (Composing c : composing)
c.dispose();
System.gc();
// Verify failure:
new Composing(new Shared());
System.gc();
}
}