- 相關(guān)推薦
Java語言程序調(diào)試技巧與多線程問題
導(dǎo)語:Java是一種應(yīng)用于互聯(lián)網(wǎng)的分布式環(huán)境的編程語言。Java語言易于使用,而且在編程時(shí)采用“以對(duì)象為導(dǎo)向”的方式。下面就由小編為大家介紹一下Java語言程序調(diào)試技巧與多線程問題,歡迎大家閱讀!
1 JaVa語言學(xué)習(xí)常見技巧
(1)勤動(dòng)手:學(xué)編程語言要達(dá)到心領(lǐng)神會(huì)、融會(huì)貫通就必須勤動(dòng)手。成功的軟件開發(fā)人員無不經(jīng)過大量的上機(jī)鍛煉,只有理論和實(shí)踐相結(jié)合才能真正掌握編程技能。
(2)多動(dòng)腦:對(duì)于Java語言的學(xué)習(xí),建議從一開始就用面向?qū)ο蟮乃季S方式去面對(duì)你所接觸的每件事。
(3)閱讀API文檔:Java中的“類”用以滿足網(wǎng)絡(luò)化、多線程、面向?qū)ο蟮男枰,它是Java編程過程中不斷利用的資源。Java的學(xué)習(xí)更多的是去學(xué)習(xí)和掌握它所提供的API類庫。對(duì)于所接觸到的類、方法,需要仔細(xì)去閱讀文檔的說明,再用自己編寫的實(shí)例去驗(yàn)證。
(4)規(guī)范編碼習(xí)慣:一個(gè)好的編程結(jié)構(gòu)應(yīng)該是能預(yù)防錯(cuò)誤的發(fā)生,對(duì)錯(cuò)誤的預(yù)見和錯(cuò)誤出現(xiàn)以后的錯(cuò)誤處理與異常處理的良好安排。經(jīng)驗(yàn)豐富的程序員,需要良好的編碼格式規(guī)范,而且程序中的邏輯實(shí)現(xiàn)要有一種良好的結(jié)構(gòu)。
(5)定義有意義類名:養(yǎng)成為每個(gè)類、每個(gè)方法起一個(gè)有意義的名字。在程序閱讀的過程中,看到這個(gè)名字就可以知道它要實(shí)現(xiàn)的功能。
(6)添加適量注釋:注釋提高程序的可讀性和可維護(hù)性。作為一個(gè)軟件產(chǎn)品,其中不同的變量及方法可能很多,合理的注釋提高程序可讀性和維護(hù)性。
2 Java程序調(diào)試常用技巧
程序調(diào)試,是將編制的程序投入實(shí)際運(yùn)行前,用手工或編譯程序等方法進(jìn)行測(cè)試,修正語法錯(cuò)誤和邏輯錯(cuò)誤的過程[1]。調(diào)試可以幫助識(shí)別和解決應(yīng)用程序缺陷。
(1)先簡(jiǎn)后繁:先使用一個(gè)boolean量,如:debugMode,需要看看程序的輸出時(shí)可以使用:if(debugMode)System.out.println("..");在項(xiàng)目完畢后把debugMode變量設(shè)為false。
(2)自頂向下:出現(xiàn)錯(cuò)誤時(shí),要逐步縮小可能出現(xiàn)錯(cuò)誤的范圍,從整個(gè)程序到指定函數(shù),再到指定行。如:Java-Ddebug=true MyClass,在使用這種方法時(shí),必須在你所有的class中添加System.getProperty("debug")來取得調(diào)試標(biāo)志,這樣在不更改source code的情況下可以直接修改Java程序調(diào)試標(biāo)志。當(dāng)錯(cuò)誤比較麻煩時(shí),可以定義一個(gè)用于調(diào)試的類。這樣對(duì)于一個(gè)application(Test)可以進(jìn)行調(diào)用:boolean debug=DebugManager.getSystemDebug(applicationKey);
要打開Test的調(diào)試功能,只需:java -DTest.Debug=true Test
當(dāng)然這個(gè)類可以進(jìn)行進(jìn)一步擴(kuò)展,比如將其變?yōu)槿罩竟芾,控制調(diào)試信息的輸出位置等
(3)設(shè)置斷點(diǎn):斷點(diǎn)是程序運(yùn)行中中斷的地方,旨在開發(fā)者在程序運(yùn)行過程中查看程序當(dāng)前的運(yùn)行狀態(tài)?梢栽跍y(cè)試時(shí)啟用斷言驗(yàn)證,而在部署時(shí)禁用斷言驗(yàn)證。a.條件斷點(diǎn)。加一個(gè)布爾條件,該斷點(diǎn)會(huì)被激活,條件為真,就會(huì)執(zhí)行該斷點(diǎn),否則將會(huì)跳過往下執(zhí)行。b.異常斷點(diǎn)。程序在遇到空指針異常(NullPointerException)時(shí),添加一個(gè)異常斷點(diǎn),可以繼續(xù)調(diào)試程序。
(4)單步執(zhí)行程序:追蹤類里面的方法體的整個(gè)執(zhí)行過程,不需要設(shè)置斷點(diǎn)就可以停止一個(gè)GUI程序的執(zhí)行。設(shè)置斷點(diǎn)后在調(diào)試器里面開始執(zhí)行程序,當(dāng)碰到第一個(gè)斷點(diǎn)后,可以進(jìn)入方法體或類體,也可以繼續(xù)運(yùn)行直到下一個(gè)斷點(diǎn)或程序結(jié)束。
3 Java應(yīng)用程序常見多線程問題
Java編程語言的多線程簡(jiǎn)單有效,比其他語言更容易實(shí)現(xiàn)。Java程序包括客戶端和服務(wù)器端。常見的多線程問題包括活鎖、死鎖、隱性死鎖和數(shù)據(jù)競(jìng)爭(zhēng)。
(1)活鎖:當(dāng)一個(gè)線程忙于接受新任務(wù)以致它永遠(yuǎn)沒有機(jī)會(huì)完成任何任務(wù)時(shí),就會(huì)發(fā)生活鎖。這個(gè)線程最終將超出緩沖區(qū)并導(dǎo)致程序崩潰。試想一個(gè)秘書需要錄入一封信,但她一直在忙于接電話,所以這封信永遠(yuǎn)不會(huì)被錄入。
(2)死鎖。當(dāng)一個(gè)線程需要一個(gè)資源而另一個(gè)線程持有該資源的鎖時(shí),就會(huì)發(fā)生死鎖。如何發(fā)現(xiàn)問題并解決之。1)防止死鎖的方法是對(duì)競(jìng)爭(zhēng)的資源引入序號(hào),如果一個(gè)線程需要幾個(gè)資源,那么它必須先得到小序號(hào)的資源,再申請(qǐng)大序號(hào)的資源?梢栽贘ava代碼中增加同步關(guān)鍵字的使用,這樣可以減少死鎖,但這樣做也會(huì)影響性能。2)當(dāng)進(jìn)行嵌套的調(diào)用時(shí),了解哪些調(diào)用使用了與其它調(diào)用同樣的數(shù)據(jù)庫連接。即使嵌套調(diào)用運(yùn)行在同一個(gè)全局事務(wù)中,它仍將使用不同的數(shù)據(jù)庫連接,而不會(huì)導(dǎo)致嵌套死鎖。3)確保在峰值并發(fā)時(shí)有足夠大的資源池。4)避免執(zhí)行數(shù)據(jù)庫調(diào)用或在占有Java虛擬機(jī)鎖時(shí),執(zhí)行其他與Java虛擬機(jī)無關(guān)的操作。
(3)隱性死鎖:“占有并等待”還可能引發(fā)一連串的線程等待,例如,線程A占有線程B需要的鎖并等待,而線程B又占有線程C需要的鎖并等待等。
(4)數(shù)據(jù)競(jìng)爭(zhēng):數(shù)據(jù)競(jìng)爭(zhēng)是由于訪問共享資源時(shí)不適當(dāng)?shù)剡\(yùn)用同步機(jī)制引起的。如果沒有正確地限定某一時(shí)刻某一個(gè)線程可以訪問變量,就會(huì)出現(xiàn)數(shù)據(jù)競(jìng)爭(zhēng),會(huì)導(dǎo)致不可預(yù)知的結(jié)果。由于線程的運(yùn)行可以在任何時(shí)候被中斷(即運(yùn)行機(jī)會(huì)被其它線程搶占),所以不能假定先開始運(yùn)行的線程總是比后開始運(yùn)行的線程先訪問到兩者共享的數(shù)據(jù)。另外,在不同的vm上,線程的調(diào)度方式也可能不同,從而使數(shù)據(jù)競(jìng)爭(zhēng)問題更加復(fù)雜。
多線程編程需要之前詳細(xì)設(shè)計(jì)系統(tǒng),這樣能夠避免難以發(fā)現(xiàn)的死鎖的問題。死鎖在語言層面上不能解決,就需要一個(gè)良好設(shè)計(jì)來避免死鎖。
【Java語言程序調(diào)試技巧與多線程問題】相關(guān)文章:
java語言的多線程04-19
Java多線程問題總結(jié)03-03
Java多線程的開發(fā)技巧04-21
關(guān)于Java程序員面試中的多線程問題總結(jié)06-18
java的多線程04-09
java多線程05-11
java多線程教程04-22