下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、java編程的總結(jié)與思考java編程的總結(jié)與思考編寫優(yōu)質(zhì)的并發(fā)代碼是一件難度極高的事情。Java語言從第一 版本開始內(nèi)置了對(duì)多線程的支持,這一點(diǎn)在當(dāng)年是非常了不起的, 但是當(dāng)我們對(duì)并發(fā)編程有了更深刻的認(rèn)識(shí)和更多的實(shí)踐后,實(shí)現(xiàn)并 發(fā)編程就有了更多的方案和更好的選擇。本文是對(duì)并發(fā)編程的一點(diǎn) 總結(jié)和思考,為什么需要并發(fā)并發(fā)其實(shí)是一種解耦合的策略,它幫助我們把做什么(目標(biāo))和什 么時(shí)候做(時(shí)機(jī))分開。這樣做可以明顯改進(jìn)應(yīng)用程序的吞吐量(獲得 更多的CPU調(diào)度時(shí)間)和結(jié)構(gòu)(程序有多個(gè)部分在協(xié)同工作)。做過 JavaWeb開發(fā)的人都知道,JavaWeb中的Servlet程序在Servlet容 器的支持下采
2、用單實(shí)例多線程的工作模式,Servlet容器幫助你處 理了并發(fā)請(qǐng)求的問題。誤解和正解最常見的對(duì)并發(fā)編程的誤解有以下這些:A. 并發(fā)總能改進(jìn)性能。(真相:并發(fā)在CPU有很多空閑時(shí)間時(shí)能 明顯改進(jìn)程序的性能,但當(dāng)線程數(shù)量較多的時(shí)候,線程間頻繁的調(diào) 度切換反而會(huì)讓系統(tǒng)的性能下降)B. 編寫并發(fā)程序無需修改原有的設(shè)計(jì)。(真相:目的與時(shí)機(jī)的解 耦往往會(huì)對(duì)系統(tǒng)結(jié)構(gòu)產(chǎn)生巨大的影響)C. 在使用Web或EJB容器時(shí)不用關(guān)注并發(fā)問題。(真相:只有了 解了容器在做什么,才能更好的使用容器)下而的這些說法才是對(duì)并發(fā)編程比較客觀的認(rèn)識(shí):A. 編寫并發(fā)程序會(huì)在代碼上增加額外的開銷。B. 正確的并發(fā)是非常復(fù)雜的,即使對(duì)于
3、很簡單的問題。C. 并發(fā)中的缺陷因?yàn)椴灰字噩F(xiàn)也不容易被發(fā)現(xiàn)。D. 并發(fā)往往需要對(duì)設(shè)計(jì)策略從根木上進(jìn)行修改。并發(fā)編程的原則和技巧1. 單一職責(zé)原則:分離并發(fā)相關(guān)代碼和其他代碼(并發(fā)相關(guān)代碼 有自己的開發(fā)、修改和調(diào)優(yōu)生命周期)。2. 限制數(shù)據(jù)作用域:兩個(gè)線程修改共享對(duì)象的同一字段時(shí)可能會(huì) 相互干擾,導(dǎo)致不可預(yù)期的行為,解決方案之一是構(gòu)造臨界區(qū),但 是必須限制臨界區(qū)的數(shù)量。下面的這些說法才是對(duì)并發(fā)客觀的認(rèn)識(shí):-編寫并發(fā)程序會(huì)在代碼上增加額外的開銷-正確的并發(fā)是非常復(fù) 雜的,即使對(duì)于很簡單的問題-并發(fā)中的缺陷因?yàn)椴灰字噩F(xiàn)也不容易 被發(fā)現(xiàn)-并發(fā)往往需要對(duì)設(shè)計(jì)策略從根本上進(jìn)行修改并發(fā)編程的原則和 技巧單一
4、職責(zé)原則分離并發(fā)相關(guān)代碼和其他代碼(并發(fā)相關(guān)代碼有自 己的開發(fā)、修改和調(diào)優(yōu)生命周期)。限制數(shù)據(jù)作用域兩個(gè)線程修改共 享對(duì)象的同一字段時(shí)可能會(huì)相互干擾,導(dǎo)致不可預(yù)期的行為,解決 方案之一是構(gòu)造臨界區(qū),但是必須限制臨界區(qū)的數(shù)量。使用數(shù)據(jù)副 木數(shù)據(jù)副木是避免共享數(shù)據(jù)的好方法,復(fù)制出來的對(duì)象只是以只讀 的方式對(duì)待。Java5 的 java. util, concurrent 包中增加一個(gè)名為 CopyOnWriteArrayList的類,它是List接口的子類型,所以你可 以認(rèn)為它是ArrayList的線程安全的版本,它使用了寫時(shí)復(fù)制的方 式創(chuàng)建數(shù)據(jù)副本進(jìn)行操作來避免對(duì)共享數(shù)據(jù)并發(fā)訪問而引發(fā)的問題。
5、線程應(yīng)盡可能獨(dú)立讓線程存在于自己的世界中,不與其他線程共享 數(shù)據(jù)。有過JavaWeb開發(fā)經(jīng)驗(yàn)的人都知道,Servlet就是以單實(shí)例 多線程的方式工作,和每個(gè)請(qǐng)求相關(guān)的數(shù)據(jù)都是通過Servlet子類 的service方法(或者是doGet或doPost方法)的參數(shù)傳入的。只要 Servlet中的代碼只使用局部變量,Servlet就不會(huì)導(dǎo)致同步問題。springMVC的控制器也是這么做的,從請(qǐng)求中獲得的對(duì)象都是以 方法的參數(shù)傳入而不是作為類的成員,很明顯Struts2的做法就正 好相反,因此Struts2中作為控制器的Action類都是每個(gè)請(qǐng)求對(duì)應(yīng) 一個(gè)實(shí)例。Java5以前的并發(fā)編程Java的線程
6、模型建立在搶占式線 程調(diào)度的基礎(chǔ)上,也就是說:所有線程可以很容易的共享同一進(jìn)程 中的對(duì)象。能夠引用這些對(duì)象的任何線程都可以修改這些對(duì)象。為 了保護(hù)數(shù)據(jù),對(duì)象可以被鎖住。Java基于線程和鎖的并發(fā)過于底層, 而且使用鎖很多時(shí)候都是很萬惡的,因?yàn)樗喈?dāng)于讓所有的并發(fā)都 變成了排隊(duì)等待。在Java5以前,可以用synchronized關(guān)鍵字來實(shí)現(xiàn)鎖的功能, 它可以用在代碼塊和方法上,表示在執(zhí)行整個(gè)代碼塊或方法之前線 程必須取得合適的鎖。對(duì)于類的非靜態(tài)方法(成員方法)而言,這意 味這要取得對(duì)象實(shí)例的鎖,對(duì)于類的靜態(tài)方法(類方法)而言,要取 得類的Class對(duì)象的鎖,對(duì)于同步代碼塊,程序員可以指定要取得
7、 的是那個(gè)對(duì)象的鎖。不管是同步代碼塊還是同步方法,每次只有一 個(gè)線程可以進(jìn)入,如果其他線程試圖進(jìn)入(不管是同一同步塊還是不 同的同步塊),JVM會(huì)將它們掛起(放入到等鎖池中)。這種結(jié)構(gòu)在并 發(fā)理論中稱為臨界區(qū)(critical sect ion)。這里我們可以對(duì)Java中用synchronized實(shí)現(xiàn)同步和鎖的功能做 一個(gè)總結(jié):只能鎖定對(duì)象,不能鎖定基本數(shù)據(jù)類型被鎖定的對(duì)象數(shù) 組中的單個(gè)對(duì)象不會(huì)被鎖定同步方法可以視為包含整個(gè)方法的 synchronized (this) 代碼塊靜態(tài)同步方法會(huì)鎖定它的Class對(duì) 象內(nèi)部類的同步是獨(dú)立于外部類的synchronized修飾符并不是方法 簽名的組成
8、部分,所以不能出現(xiàn)在接口的方法聲明中非同步的方法 不關(guān)心鎖的狀態(tài),它們?cè)谕椒椒ㄟ\(yùn)行時(shí)仍然可以得以運(yùn)行 synchronized實(shí)現(xiàn)的鎖是可重入的鎖。在JVM內(nèi)部,為了提高效率, 同時(shí)運(yùn)行的每個(gè)線程都會(huì)有它正在處理的數(shù)據(jù)的緩存副本,當(dāng)我們 使用synchronzied進(jìn)行同步的時(shí)候,真正被同步的是在不同線程中 表示被鎖定對(duì)象的內(nèi)存塊(副木數(shù)據(jù)會(huì)保持和主內(nèi)存的同步,現(xiàn)在知 道為什么要用同步這個(gè)詞匯了吧),簡單的說就是在同步塊或同步方 法執(zhí)行完后,對(duì)被鎖定的對(duì)象做的任何修改要在釋放鎖之前寫回到 主內(nèi)存中;在進(jìn)入同步塊得到鎖之后,被鎖定對(duì)象的數(shù)據(jù)是從主內(nèi)存 中讀出來的,持有鎖的線程的數(shù)據(jù)副本一定和主內(nèi)存中的數(shù)據(jù)視圖 是同步的。在Java最初的版本中,就有一個(gè)叫Volat訂e的關(guān)鍵字, 它是一種簡單的同步的處理機(jī)制,因?yàn)楸籿olatile修飾的變量遵循 以下規(guī)則:變量的值在使用之前總會(huì)從主內(nèi)存中再讀取出來。對(duì)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度影視作品拍攝制作合同4篇
- 二零二五年度模特形象代言效果評(píng)估服務(wù)合同4篇
- 二零二五年版離婚后財(cái)產(chǎn)分配協(xié)議范本:女方不要求財(cái)產(chǎn)4篇
- 2025年度個(gè)人無息借款合同風(fēng)險(xiǎn)評(píng)估與管理4篇
- 二零二五年度環(huán)保型打印耗材供應(yīng)與回收合同3篇
- 二零二四年度榨菜種植與農(nóng)村電商體系建設(shè)合同3篇
- 23年-24年項(xiàng)目安全培訓(xùn)考試題(達(dá)標(biāo)題)
- 二零二五年度金屬?zèng)_壓廢棄物回收利用合作協(xié)議4篇
- 23年-24年員工三級(jí)安全培訓(xùn)考試題附參考答案(鞏固)
- 23-24年員工三級(jí)安全培訓(xùn)考試題【鞏固】
- 【“凡爾賽”網(wǎng)絡(luò)流行語的形成及傳播研究11000字(論文)】
- ppr管件注塑工藝
- 液化氣站其他危險(xiǎn)和有害因素辨識(shí)及分析
- 建筑工程施工安全管理思路及措施
- 高中語文教學(xué)課例《勸學(xué)》課程思政核心素養(yǎng)教學(xué)設(shè)計(jì)及總結(jié)反思
- 中國農(nóng)業(yè)銀行小微企業(yè)信貸業(yè)務(wù)貸后管理辦法規(guī)定
- 初中英語-Unit2 My dream job(writing)教學(xué)課件設(shè)計(jì)
- 市政道路建設(shè)工程竣工驗(yàn)收質(zhì)量自評(píng)報(bào)告
- 優(yōu)秀支行行長推薦材料
- 中國版梅尼埃病診斷指南解讀
- 暨南大學(xué)《經(jīng)濟(jì)學(xué)》考博歷年真題詳解(宏觀經(jīng)濟(jì)學(xué)部分)
評(píng)論
0/150
提交評(píng)論