您的位置:首页 > 其它

使用 引用计数 来跟踪访问共享对象的对象数量

2017-03-01 16:09 344 查看
来自于 think in java

import static org.print.Print.*;

class Shared{
private int refcount=0;
private static long counter=0;  // 跟踪实例对象
private final long id=counter++; //id定义为final,不希望它的值在对象的生命周期内被改变
public Shared(){  print("creating   "+this); }
public void addRef(){ refcount++;	} //当有一个对象附到类上时,调用addRef()
protected void dispose(){
if(--refcount==0)
print("Disposing   "+ this);
}
protected void finalize(){
if(refcount != 0 ){ print("Error: object os not proper clean-up!");}   //校验终止条件,当有对象引用,不允许清理;
}
public String toString(){ return "Shared   "+id;	}
}

class Composing{
private Shared shared;
private static long counter=0;
private final long id=counter++;
public Composing(Shared shared){
print("creating  "+this);
this.shared=shared;
this.shared.addRef();
}
protected void dispose(){
print("disposing  "+ this);
shared.dispose();
}
public String toString(){ return "composing  "+id;}
}

public class ReferCounting {
public static void main(String[] args){
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();
new Composing(new Shared());
System.gc();
}
}


output:

creating   Shared   0

creating  composing  0

creating  composing  1

creating  composing  2

creating  composing  3

creating  composing  4

disposing  composing  0

disposing  composing  1

disposing  composing  2

disposing  composing  3

disposing  composing  4

Disposing   Shared   0

creating   Shared   1

creating  composing  5

Error: object os not proper clean-up!

可以看出使最后一个composing对象存活,报错!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: