Effective Java之避免使用终结方法(七)
1.終結(jié)方法的缺點(diǎn)
1.終結(jié)方法不能保證及時(shí)執(zhí)行,因此注重時(shí)間的任務(wù)不應(yīng)該由終結(jié)方法來完成。例如:用終結(jié)方法去關(guān)閉已經(jīng)打開的文件,這是一種嚴(yán)重錯(cuò)誤,因?yàn)榇蜷_文件描述符是一種很有限的資源,如果jvm延遲終結(jié)方法,導(dǎo)致多個(gè)文件處于打開的狀態(tài)。
2.終結(jié)方法不能保證一定會(huì)被執(zhí)行。如果企圖通過終結(jié)方法釋放共享資源上的永久鎖,會(huì)使整個(gè)分布式系統(tǒng)掛掉。
3.不要被System.gc和System.runFinalization所迷惑,它們確實(shí)增加了終結(jié)方法執(zhí)行的機(jī)會(huì),但是它們并不保證終結(jié)方法一定執(zhí)行。
4.使用終結(jié)方法會(huì)有嚴(yán)重的性能損失
2.終結(jié)方法的替代品-顯式終止方法
1.顯式的終止方法,要求該類的客戶端在每個(gè)實(shí)例不再使用時(shí)調(diào)用這個(gè)方法。如inputstream的close方法。
2.顯示的終止方法必須在一個(gè)私有域中記錄“該對(duì)象不再有效”,然后如果這個(gè)類的方法在對(duì)象終止之后被調(diào)用了,那么這個(gè)方法會(huì)先檢查這個(gè)域,并拋出IllegalStateException錯(cuò)誤。
3.顯式的終止方法通常與try-catch結(jié)構(gòu)結(jié)合起來使用,來確認(rèn)即使終止。
3.終結(jié)方法用途
充當(dāng)安全網(wǎng),如果對(duì)象忘記調(diào)用顯示終止方法時(shí),終結(jié)方法發(fā)現(xiàn)資源還沒有終止,則應(yīng)該在日志中記錄一條警告。
本地對(duì)等體(native peer),一個(gè)本地對(duì)象(native object),普通對(duì)象通過本地方法(native method)委托給一個(gè)本地對(duì)象。
因?yàn)楸镜貙?duì)等體不是一個(gè)普通對(duì)象,所以垃圾回收器不會(huì)知道它,當(dāng)它的java對(duì)等體被回收的時(shí)候,它不會(huì)被回收,這時(shí)候就要用到終止方法,如果本地對(duì)等體不含有關(guān)鍵資源,那么終結(jié)方法便是最恰當(dāng)?shù)姆椒?#xff0c;如果含有關(guān)鍵資源,那么該類應(yīng)該具有一個(gè)顯式終止方法。
4.終結(jié)方法鏈問題:
如果類(不是Object)有終結(jié)方法,并且子類覆蓋了終結(jié)方法,子類的終結(jié)方法就必須手工調(diào)用超類的終結(jié)方法,否則超類的終結(jié)方法將永遠(yuǎn)也不會(huì)被調(diào)用。
為了避免這個(gè)問題的發(fā)生,我們使用終結(jié)方法守衛(wèi)者方法:
public class FinalizerGuardian { private final Object finalizerGuardian = new Object() { protected void finalize() throws Throwable { System.out.println("finalize " + this); }; }; public void doSomething() { System.out.println("do something"); } public static void main(String[] args) { FinalizerGuardian fg = new FinalizerGuardian(); fg.doSomething(); fg = null; // 使用十次顯式gc增加調(diào)用終結(jié)方法的概率 for (int i = 0; i < 10; i++) { System.gc(); } } }這種方式把終結(jié)方法放在一個(gè)匿名的內(nèi)部類中,這個(gè)匿名內(nèi)部類的作用是終結(jié)它的外圍實(shí)例,這種匿名類的單個(gè)實(shí)例叫做終結(jié)方法守衛(wèi)者,當(dāng)終結(jié)方法守衛(wèi)者被終結(jié)的時(shí)候,他會(huì)調(diào)用它的終結(jié)方法讓外圍實(shí)例終結(jié),這樣看起來就像外圍實(shí)例自己執(zhí)行終結(jié)方法一樣。
總結(jié)
以上是生活随笔為你收集整理的Effective Java之避免使用终结方法(七)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Effective Java之覆盖equ
- 下一篇: Effectice Java之始终覆盖t