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

来自于 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对象存活,报错!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值