使用 引用計數 來跟蹤訪問共享對象的對象數量

來自於 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對象存活,報錯!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章