I want to fly higher
programming Explorer
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 114,comments - 263,trackbacks - 0
<
2013年3月
>
日
一
二
三
四
五
六
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
留言簿
(5)
給我留言
查看公開留言
查看私人留言
隨筆分類
(161)
Book(25)
ClassLoader(5)
Concurrency
Dababase
GameServer(10)
HighPerformance
HotSwap(9)
IO
JVM(6)
Language(2)
Mobile
NetWork(2)
NoSQL
Note(8)
OS(6)
Program(69)
Script(1)
ServerFramework(6)
Shell
Sources(8)
Translations
Utils(4)
隨筆檔案
(114)
2018年6月 (1)
2018年3月 (1)
2017年3月 (2)
2017年2月 (2)
2017年1月 (1)
2016年11月 (2)
2016年7月 (4)
2016年6月 (3)
2016年5月 (2)
2015年12月 (2)
2015年10月 (1)
2015年8月 (1)
2015年7月 (4)
2015年6月 (5)
2014年12月 (1)
2014年11月 (4)
2014年4月 (1)
2014年3月 (3)
2014年2月 (5)
2014年1月 (1)
2013年12月 (7)
2013年11月 (4)
2013年8月 (5)
2013年7月 (3)
2013年3月 (6)
2013年1月 (6)
2012年7月 (1)
2011年12月 (9)
2011年8月 (2)
2011年5月 (1)
2011年2月 (2)
2011年1月 (1)
2010年12月 (2)
2010年11月 (1)
2010年7月 (8)
2010年4月 (3)
2010年3月 (3)
2010年2月 (2)
2010年1月 (2)
文章分類
(2)
學習筆記(2)
文章檔案
(2)
2011年12月 (2)
Alibaba
搜索技術博客-淘寶
淘寶開源項目
阿里中間件團隊博客
阿里技術嘉年華
阿里核心系統團隊博客
Comprehensive
InfoQ - 促進軟件開發領域知識與創新的傳播
LinkedIn
stackoverflow
伯樂在線
內存-溢出 為程序員服務
騰訊大講堂
解道
Expert
jrebel
國外牛博
并發編程高手
莊周夢蝶
洞庭散人
美團技術博客
褚霸
Game
云風
Java
JavaEye做最棒的軟件開發交流社區
coderanch
IBM developerWorks 中國 Java 技術專區
Java Tutorials
Javalobby
javapapers
java-source
java-tips
javaworld
Java極客
Java譯站
Programming Tutorial
TheServerSide
專注Java & Android 技術分享
并發編程網
搜索
積分與排名
積分 - 598835
排名 - 78
最新評論
1.?re: Eclipse反編譯工具Jad及插件JadClipse配置
剛剛問題解決了,file types中, .class下還有一個 .class without source。
把這個也設置成JadClipse為默認選項打開嘛,即可。
謝謝版主~~~
--tangyuan
2.?re: Eclipse反編譯工具Jad及插件JadClipse配置
eclipse4.6版本,按照上述來的不行,版主還有推薦的反編工具嘛,推薦一個呢
--tangyuan
3.?re: 交換兩個值,不用臨時變量(C位運算)[未登錄]
評論內容較長,點擊標題查看
--123
4.?re: Markdown基礎語法及發布blog
確實很基礎的語法,很容易就學會了!
--有機綠茶
5.?re: Java8之Stream/Map[未登錄]
總結的很詳細!
--jay
閱讀排行榜
1.?Eclipse反編譯工具Jad及插件JadClipse配置(134346)
2.?Unknown Source的出現及解決(39486)
3.?MMORPG服務器架構(33463)
4.?Java8之Stream/Map(24531)
5.?淺談Eclipse dropins插件安裝的"坑"(附m2e的各個版本插件下載)(19624)
Effective Java 2nd筆記6:避免使用終結方法
第七條:避免使用終結方法
1.終結方法
finalizer
通常是不可預測的,也是很危險的.一般情況下是不必要的。使用終結方法會導致行為不穩定,降低性能,以及可移植性問題。根據經驗,應
避免使用終結方法。
2.C++的程序員被告知不要把終結方法當做是C++析構器destuctors的對應物。在C++中,析構器是回收一個對象所占用資源的常規方法,是構造器所必須的對應物。在Java中,當一個對象變得不可達到的時候,垃圾回收器會回收與該對象相關聯的存儲空間,并不需要程序員做專門的工作,C++的析構器也可以用來回收其他的非內存資源。而在Java中,一般用
try-finally
塊來完成類似的工作。
3.終結方法的缺點在于不能保證會及時的執行。
從一個對象變得不可到達開始,到它的終結方法被執行,所花費的這段時間是任意長的
。即注重時間time-critical的任務不應該由終結方法來執行。如用終結方法來關閉已經打開的文件,這是嚴重錯誤,因為打開文件的描述符是一種很有限的資源。由于JVM延遲執行終結方法,所以大量的文件會保留在打開狀態,當一個程序不能再打開文件的時候,它可能會運行失敗。
4.
及時的執行終結方法時垃圾回收算法的一個主要功能,這種算法在不同的JVM實現中大相徑庭
。如果程序依賴終結方法被執行的時間點,那么這個程序的行為在不同的JVM中運行的表現可能會截然不同.如一個程序在你測試用的JVM平臺運行的很好,而在你的最重要的顧客的JVM平臺上卻根本無法運行, 這完全有可能。
5.延遲終結過程并不只是一個理論問題。在很少見的情況下,為類提供終結方法,可能會隨意的延遲期實例的回收過程。如可能在調試一個長期運行的GUI應用程序的時候,該應用程序總是莫名的出現
OutOfMemoryError
錯誤而死掉。分析表明,該應用程序死掉的時候,其終結方法隊列中有數千個圖形對象正在等待被終結和回收。遺憾的時候,終結方法線程的優先級比該應用程序的其他線程的要低很多,所以圖形對象的終結速度達不到他們進入隊列的速度。
Java語言規范并不保證哪個線程將會執行終結方法
,所以除了不使用終結方法之外,并沒有很輕便的方法能夠避免這樣的問題。
6.
Java語言規范不僅不能保證終結方法會被及時的執行,而且根本就不保證他們會執行
。當一個程序終止的時候,某些已經無法訪問的對象上的終結方法卻根本沒有被執行,這是完全可能的。結論是:不應該依賴終結方法來更新重要的持久狀態。如依賴終結方法來釋放共享資源如數據庫上的永久鎖,很容易讓這個分布式系統垮掉。
7.不要被
System.gc
和
System.runFinalization
這兩個方法所誘惑,他們確實增加了終結方法被執行的機會,但是他們并不保證終結方法一定會被執行。唯一聲稱保證終結方法被執行的方法是System.runFinalizersOnExit以及其臭名昭著的孿生兄弟Runtime.runFinalizersOnExit,這兩個方法都有致命的缺陷,已經被廢棄了。
注
:System#runFinalizersOnExit|Runtime#runFinalizersOnExit:
該方法具有固有的不安全性。它可能對正在使用的對象調用終結方法,而其他線程同時正在操作這些對象,從而導致不正確的行為或死鎖。
8.當你并不確定是否應該避免使用終結方法的時候,這還有一種需要考慮的情況:如果未被捕獲的異常在終結過程中被拋出來了,那么這種異常可以被忽略,并且該對象的終結過程也會被終止。未被捕獲的異常會使對象處于破壞的狀態a corrupt state,如果另一個線程企圖使用這種被破壞的對象,則可能發生任何不確定的行為。 正常情況下,未被捕獲的異常會使線程終止,并打印出棧軌跡stack trace。但是如果異常發生在終結方法之中,則不會如此,甚至連警告都不會打印出來。
9.還有一點,使用終結方法有一個非常
嚴重的Severe性能損失
。某測試數據:創建和銷毀一個簡單對象的時間大約為5.6ns。增加一個終結方法使時間增加到了2400ns。換句話說,用終結方法創建和銷毀對象慢了大約430倍。
10.如果類的對象中封裝的資源如文件或者線程確實需要終止,應該如何做而不編寫終結方法呢。只需提供一個顯示的終止方法,并要求該類的客戶端在每個實例不再有用的時候調用這個方法。有一個細節是該實例必須記錄下自己是否已經被終止了;顯示的終止方法必須在一個私有域中記錄下“該對象已經不再有效”。如果這些方法時在對象已經終止之后被調用,其他的方法就必須檢查這個于,并拋出IllegalStateException。
顯示終止方法的典型例子是InputStream,OutputStream,java.sql.Connection上的close方法
。另一個例子是java.util.Timer上的cancel方法,它執行必要的狀態改變,是的與Timer實例相關聯的該線程溫和的終止自己。java.awt中的例子還包括Graphics.dispose和Window.dispose這些方法通常由于性能不好而不被人們關注。一個相關的方法時Image.flush,它會釋放所有域Image實例相關資源,但是該實例仍然處于可用的狀態,如果有必要的話,會重新分配資源.
注
:如1.FileOutputStream#private volatile boolean closed = false;
2.java.io.Closeable | java.lang.AutoCloseable[since 1.7]|
{@link
ExplicitClose}
11.終結方法的
好處:
1.當對象的所有者忘記調用之前建議的顯示終止方法時,終結方法可以充當
安全網
,safety net.雖然這種做并不能保證終結方法會被及時的調用,但是在客戶端無法通過調用顯示的終止方法來正確結束操作的情況下(希望這種情形盡可能的少發生),遲一點釋放關鍵資源總比永遠不釋放要好。但是如果終結方法發現資源還未被終止,則應該在日志中記錄一條警告。因為這表示客戶端代碼中的一個bug,應該得到修復。如果正考慮編寫這樣的安全網終結方法,就要考慮清楚這種額外的保護是否值得付出額外的代價。
2.顯示終止方法模式的實例中所示的四個類FileInputStream,FileOutputStream,Timer和Connection,都具有終結方法。當他們的終止方法未能被調用的情況下,這些終結方法充當了安全網。
注:FileInputStream#filnalize:
/**
* Ensures that the <code>close</code> method of this file input stream is
* called when there are no more references to it.
*
* @exception IOException if an I/O error occurs.
* @see java.io.FileInputStream#close()
*/
protected void finalize() throws IOException {
if ((fd != null) && (fd != FileDescriptor.in)) {
/*
* Finalizer should not release the FileDescriptor if another
* stream is still using it. If the user directly invokes
* close() then the FileDescriptor is also released.
*/
runningFinalize.set(Boolean.TRUE);
try {
close();
} finally {
runningFinalize.set(Boolean.FALSE);
}
}
}
3.終結方法的第二種合理用于與對象的
本地對等體native pee
r有關。本地對等體是一個本地對象native object,普通對象通過本地方法native method委托給一個本地對象。因為本地對等體不是一個普通對象,所以垃圾回收器不會知道它。當它的Java對等體被回收的時候,它不會被回收。在本地對等體并不擁有關鍵資源的前提下(注是否因為關鍵資源可被本地其他進程使用),終結方法正是執行任務的最合適的工具。如果本地對等體用于必須被及時終止的資源, 那么該類就應該具有一個顯示的終止方法,如前所述。終止方法應該完成所有必要的工作以便釋放關鍵的資源。終止方法可以使本地方法或者也可以調用本地方法。
12.注意
終結方法鏈finalizer chaining并不會自動執行
。如果類不是Object有終結方法,并且子類覆蓋了終結方法,子類的終結方法就必須手動調用超類的終結方法。你應該在一個try快中終結子類,并且在相應的finally塊中調用超類的終結方法。這樣可以保證,即使子類的終結過程拋出異常,超類的終結方法也會得到執行。反之亦然。注:{@link FinalizerChaining}
13.如果子類實現這覆蓋了超類的終結方法,但是忘了手工調用超類的終結方法或者有意選擇不調用超類的終結方法,那么超類的終結方法將永遠不會得到調用。要防范這樣的粗心大意或者而已的子類是有可能的,代價就是為每個將被終結的對象創建一個附加的對象,不是把終結方法放在要求終結處理的類中,而是把終結方法放在一個匿名的類中,該匿名類的唯一用途是終結它的外圍實例enclosing instance.該匿名類的單個實例被稱為
終結方法守衛者finalizer guardian
.外圍類的每個實例都會創建這樣一個守衛者,外圍實例在它的私有實例域中保存一個對其終結方法守衛者的唯一引用,因為終結方法守衛者與外圍實例可以同時啟動終結過程。當守衛者被終結的時候, 它執行外圍實例所期望的終結行為,就好像它的終結方法是外圍對象上的一個方法一樣。
注
:{@link FinalizerGuardian}-->在終結方法守衛者以為是實例變量?,所以必然會被銷毀?,進而其終結的時候必然會調用外圍類的終結發方法。
14.
總結:除非是作為安全網或者是為了終止非關鍵的本地資源,否則請不要使用終結方法。在這些很少見的情況下,既然使用了終結方法就要記住調用super.finalize.如果用終結方法作為安全網,要記得記錄終結方法的非法用法。最好,如果需要把終結方法與公有的非final(注:final的無子類)的類關聯起來,請考慮使用終結方法守衛者,以確保即使子類的終結方法未能調用super.finalize,該終結方法也會被執行。
部分源碼:
package
com.book.chap2.avoidFinalizer;
/** */
/**
*
*顯示的終止方法
*<pre>
*1.通常與try-finally結構結合起來使用,以確保及時終止。在finally子句內部調用顯示的終止方法,可以保證即使在使用對象的時候有異常拋出,該終止方法
*也會執行。
*</pre>
*
*
@author
landon
*
@since
1.6.0_35
*
@version
1.0.0 2013-3-14
*
*/
public
class
ExplicitClose
{
public
void
terminate()
{
//
顯示的終止方法
}
public
static
void
main(String
args)
{
ExplicitClose close
=
new
ExplicitClose();
try
{
//
做一些必要的事情
}
finally
{
close.terminate();
//
顯示的調用終止方法
}
}
}
package
com.book.chap2.avoidFinalizer;
/** */
/**
*
*終結方法鏈不會自動執行,需手動調用超類的終結方法。
*<p>
* 在一個try快中終結子類,并且在相應的finally塊中調用超類的終結方法。這樣可以保證,即使子類的終結過程拋出異常,超類的終結方法也會得到執行
*</p>
*
*
@author
landon
*
@since
1.6.0_35
*
@version
1.0.0 2013-3-14
*
*/
public
class
FinalizerChaining
{
@Override
protected
void
finalize()
throws
Throwable
{
try
{
//
終結子類的狀態
}
finally
{
super
.finalize();
}
}
}
package
com.book.chap2.avoidFinalizer;
/** */
/**
*
*終結方法保衛者
*<pre>
*1.為每個將被終結的對象創建一個附加的對象,不是把終結方法放在要求終結處理的類中,而是把終結方法放在一個匿名的類中,
*該匿名類的唯一用途是終結它的外圍實例enclosing instance.該匿名類的單個實例被稱為終結方法守衛者finalizer guardian.
*外圍類的每個實例都會創建這樣一個守衛者,外圍實例在它的私有實例域中保存一個對其終結方法守衛者的唯一引用,
*因為終結方法守衛者與外圍實例可以同時啟動終結過程。當守衛者被終結的時候, 它執行外圍實例所期望的終結行為,
*就好像它的終結方法是外圍對象上的一個方法一樣
*2.FinalizerGuardian類并沒有終結方法除了從Object繼承了一個無關緊要的之外,所以子類的終結方法是否調用super.finalizer并不重要.對于每一個帶有終結方法
*的非final公有類(注意因為final類無法被繼承),都應該考慮使用這種方法。
*</pre>
*
*
@author
landon
*
@since
1.6.0_35
*
@version
1.0.0 2013-3-14
*
*/
public
class
FinalizerGuar
d
ian
{
private
final
Object finalizerGuardian
=
new
Object()
{
protected
void
finalize()
throws
Throwable
{
//
終結外圍對象
}
}
;
}
posted on 2013-03-15 19:24
landon
閱讀(2162)
評論(0)
編輯
收藏
所屬分類:
Program
、
Book
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Java游戲服務器基礎技術體系
Disruptor入門Ⅰ-Getting Started
Rust/Go/Node.js/Io.js/Groovy/Scala/Lua 語言入門 Ⅰ
Vertx VS Undertow Ⅰ
Java多線程筆記9-InheritableThreadLocal
Java8之Time/Annotation
Java8之Stream/Map
Java8之Lambda
apache-mina-2.07源碼筆記6-nio細節
Java多線程筆記8-ThreadLocal
Copyright ©2025 landon Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
日日AV拍夜夜添久久免费
|
免费A级毛片av无码
|
免费人成视频在线观看网站
|
亚洲熟妇无码乱子AV电影
|
GOGOGO免费观看国语
|
亚洲一区无码中文字幕
|
最新亚洲成av人免费看
|
亚洲久本草在线中文字幕
|
一区二区在线免费观看
|
亚洲最大成人网色香蕉
|
日韩在线a视频免费播放
|
国产日韩久久免费影院
|
亚洲欧洲中文日韩久久AV乱码
|
国产亚洲免费的视频看
|
久热免费在线视频
|
亚洲乱码无人区卡1卡2卡3
|
亚洲欧洲久久久精品
|
欧美大尺寸SUV免费
|
国产免费爽爽视频在线观看
|
亚洲精品乱码久久久久久自慰
|
亚洲精品色在线网站
|
亚洲人成电影亚洲人成9999网
|
99久久免费国产精精品
|
亚洲暴爽av人人爽日日碰
|
亚洲综合视频在线
|
久久精品国产亚洲Aⅴ蜜臀色欲
|
成年免费大片黄在线观看com
|
亚洲AV无码一区二区三区在线观看
|
国产成人 亚洲欧洲
|
亚洲卡一卡2卡三卡4麻豆
|
国产精品亚洲一区二区三区在线
|
免费看AV毛片一区二区三区
|
成人爽a毛片免费
|
少妇亚洲免费精品
|
亚洲AV永久无码天堂影院
|
亚洲高清日韩精品第一区
|
亚洲精品你懂的在线观看
|
免费中文字幕在线观看
|
四虎影视大全免费入口
|
久久久久久夜精品精品免费啦
|
亚洲精品国产国语
|