Object的finalize()方法的作用是否與C++的析構函數作用相同
public class Finalization {
private static Finalization finalization;
/**finalize在gc回收中有不确定性,是以不推薦用finalize進行回收*/
@Override
protected void finalize(){
System.out.println("finalized");
//System.gc()時,這一步可能沒有被執行到就終止了,是以可能為null或對象位址。
//可以讓線程睡眠執行此步驟
finalization=this;
}
public static void main(String[] args) {
Finalization f = new Finalization();
System.out.println("first print: "+f);
f= null;
//調用Finalization的finalize方法
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("second print: "+f);
System.out.println(finalization);
}
}
未加入線程休眠的代碼,發現finalization可能輸出為null
first print: com.gclhaha.javabasic[email protected]
second print: null
finalized
null
加入休眠代碼後
first print: [email protected]
finalized
second print: null
[email protected]
Java中強引用、軟引用、弱引用、虛引用有什麼用
強引用
軟引用
軟引用還可以配合引用隊列去使用
弱引用
弱引用還可以配合引用隊列去使用
虛引用
gc在回收對象時,這個對象具有虛引用,那麼在回收前,回将虛引用加入引用隊列中,通過判斷引用隊列中是否加入虛引用來了解被引用的對象是否被gc回收,可以起到哨兵的作用。
軟引用和弱引用也可以先像上面這樣配合ReferenceQueue使用。