資源描述:
《淺論1204012027》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、淺論1204012027淺論1204012027_俞喆軍_java課程論文導(dǎo)讀:Lock的鎖定是通過(guò)代碼實(shí)現(xiàn)的,而synchronized是在JVM層面上實(shí)現(xiàn)的。要監(jiān)控工具能監(jiān)測(cè)到Lock的鎖定那還需要有一段時(shí)日。另外,synchronized在鎖定時(shí)如果方法塊拋出異常,JVM會(huì)自動(dòng)將鎖釋放掉,不會(huì)因?yàn)槌隽水惓](méi)有釋放鎖造成線程死鎖。但是Lock的話就享受不到JVM帶來(lái)自動(dòng)的功能,出現(xiàn)異常時(shí)必須在finally將鎖釋放掉,否則學(xué)號(hào):1204012027班級(jí):12計(jì)本2班俞喆軍JAVA課程論文多線程和異常處理大三上學(xué)期學(xué)習(xí)了《java語(yǔ)言程序
2、設(shè)計(jì)》這門(mén)課程。Java語(yǔ)言是當(dāng)前計(jì)算機(jī)應(yīng)用較為廣泛的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言之一,本次課程注重對(duì)我們動(dòng)手能力的培養(yǎng)與提高。我在邊學(xué)習(xí)邊上機(jī)的過(guò)程中,深入細(xì)致的掌握這門(mén)課程。通過(guò)上機(jī)調(diào)試程序,發(fā)現(xiàn)了概念上的模糊和方法的錯(cuò)誤,最終深刻理解和掌握這門(mén)Java語(yǔ)言課程。這里,關(guān)于java中的多線程和異常處理兩方面的內(nèi)容作出自己的一些理解和學(xué)習(xí)心得。在Java語(yǔ)言中,線程的創(chuàng)建有兩種方式:(1)定義一個(gè)Thread類的子類,并在該子類中重寫(xiě)run()方法,該run()方法是線程執(zhí)行的起點(diǎn);(2)定義一個(gè)實(shí)現(xiàn)Runnable接口的類,并在該類中定義Run
3、nable接口的run()方法,同樣,該run()方法代表了線程執(zhí)行的起點(diǎn)。Thread類封裝了線程的行為,它是一個(gè)具體的類。要?jiǎng)?chuàng)建線程,必須定義一個(gè)Thread類的子類,在該子類中重寫(xiě)Thread類的run()方法,即定義線程所需完成的工作。線程的啟動(dòng)則是通過(guò)引用該Thread子類的start()方法來(lái)實(shí)現(xiàn),而實(shí)際上start()方法被引用后,其實(shí)引用該Thread子類的run()方法來(lái)啟動(dòng)線程的。也就是說(shuō),其實(shí)線程類只有一種,那就是Thread。線程有線程自己的特性,多線程提高了CPU利用率的同時(shí),也帶來(lái)了一些問(wèn)題。因此,在學(xué)習(xí)多線程,
4、其實(shí)就是學(xué)習(xí)多線程編程多帶來(lái)哪些問(wèn)題,以及如何去解決這些問(wèn)題,使得多線程能夠按照我們的意愿來(lái)執(zhí)行。首先,線程也有自己的狀態(tài),除了新建和死亡狀態(tài),就有等待/阻塞、準(zhǔn)備、和運(yùn)行狀態(tài)。同樣的,這些狀態(tài)可以轉(zhuǎn)換。線程個(gè)狀態(tài)的轉(zhuǎn)換是:準(zhǔn)備可以進(jìn)入運(yùn)行,運(yùn)行也可以進(jìn)入準(zhǔn)備;運(yùn)行還可以進(jìn)入等待/阻塞;但是等待/阻塞不能進(jìn)入運(yùn)行,等待/阻塞可以進(jìn)入準(zhǔn)備狀態(tài)。一個(gè)線程對(duì)象從創(chuàng)建、啟動(dòng)、運(yùn)行、終止,直到線程對(duì)象被Java虛擬機(jī)所釋放,其生命周期會(huì)處于各種不同的狀態(tài)。當(dāng)創(chuàng)建了線程對(duì)象,并引用其start()方法之后,該線程就進(jìn)入自身的生命周期。線程的生命周期通常
5、包含有四種狀態(tài),即“運(yùn)行”、“暫?!?、“同步”和“掛起”,這四個(gè)狀態(tài)的遷移主要是通過(guò)Thread類所提供的方法來(lái)實(shí)現(xiàn)。“運(yùn)行”和“暫?!遍g的狀態(tài)轉(zhuǎn)換是通過(guò)sleep()和join()方法來(lái)實(shí)現(xiàn),而“運(yùn)行”和“同步”之間轉(zhuǎn)換則借助于每個(gè)對(duì)象自身的e()方法完成與“運(yùn)行”狀態(tài)的轉(zhuǎn)換。這幾種狀態(tài),加上控制線程的函數(shù),就可以控制線程了,這就叫作線程的調(diào)度。新建:就是利用Thread的構(gòu)造函數(shù)定義一個(gè)線程。準(zhǔn)備:當(dāng)執(zhí)行了Thread中的strat方法,及使得線程進(jìn)入準(zhǔn)備狀態(tài),隨時(shí)可以進(jìn)入運(yùn)行狀態(tài)。運(yùn)行:當(dāng)操作系統(tǒng)的調(diào)度器把CPU分給了這個(gè)線程,這個(gè)線
6、程就進(jìn)入了運(yùn)行狀態(tài),也就是執(zhí)行我們?cè)诰€程中定義的run方法里面的內(nèi)容。等待/阻塞:當(dāng)一個(gè)線程的繼續(xù)執(zhí)行需要一個(gè)條件,但是該條件還不成熟,需要調(diào)度器來(lái)通知。而等待調(diào)度器發(fā)出通知的這段時(shí)間內(nèi),線程就進(jìn)入了等待狀態(tài)。當(dāng)一個(gè)線程訪問(wèn)一個(gè)資源的時(shí)候,這個(gè)資源正被另外的線程訪問(wèn),而這個(gè)資源是加了鎖的,只允許一個(gè)線程訪問(wèn)。這時(shí)候,線程就進(jìn)入了阻塞狀態(tài)。死亡:當(dāng)線程的run方法運(yùn)行完之后,線程死亡,這是正常死亡;當(dāng)線程方發(fā)生異常而沒(méi)有捕獲時(shí),也會(huì)死亡,這是非正常死亡。線程的同步:線程同步一般有三種方法:synchronized塊、synchronized方
7、法和加lock鎖。Synchronized方法只需在方法簽名中加入該關(guān)鍵字即可,lock鎖只要啊相應(yīng)方法中調(diào)用lock對(duì)象的lock方法即可。二者的區(qū)別:synchronized也有好處的,比如一些性能監(jiān)控工具,可以監(jiān)測(cè)到synchronized的鎖。無(wú)法監(jiān)測(cè)到Lock的鎖定,畢竟Lock的鎖定是通過(guò)代碼實(shí)現(xiàn)的,而synchronized是在JVM層面上實(shí)現(xiàn)的。要監(jiān)控工具能監(jiān)測(cè)到Lock的鎖定那還需要有一段時(shí)日。另外,synchronized在鎖定時(shí)如果方法塊拋出異常,JVM會(huì)自動(dòng)將鎖釋放掉,不會(huì)因?yàn)槌隽水惓](méi)有釋放鎖造成線程死鎖。但是Lo
8、ck的話就享受不到JVM帶來(lái)自動(dòng)的功能,出現(xiàn)異常時(shí)必須在finally將鎖釋放掉,否則將會(huì)引起死鎖。在實(shí)際的多線程編程中,會(huì)碰到多個(gè)線程對(duì)同一資源進(jìn)行訪問(wèn)的情況。比如多個(gè)線程對(duì)同