下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第淺談springboot如何保證多線程安全目錄如何保證多線程安全1.springboot在多線程并發(fā)訪問下是怎么做的2.controller在多線程下如何盡可能保證線程安全,如何取舍3.小結(jié)一下單例模式與線程安全問題踩的坑下面上一張?jiān)擃惖慕貓D我先說下我這邊的一個(gè)代碼環(huán)境下面說下我的測(cè)試結(jié)果現(xiàn)在說下解決方法
如何保證多線程安全
1.springboot在多線程并發(fā)訪問下是怎么做的
我們?cè)贑ontroller下,一般都是@AutoWired一些Service,由于這些Service都交給了spring進(jìn)行管理,因此他們單例的,對(duì)于在Controller中調(diào)用他們的方法,由于方法在JVM中屬于棧操作,所以對(duì)于每一個(gè)線程來說,棧都是獨(dú)立的,因此是線程安全的。
而由于Controller本身是單例模式(非線程安全的),這意味著每個(gè)request過來,系統(tǒng)都會(huì)用原有的instance去處理,這樣導(dǎo)致了兩個(gè)結(jié)果:一是我們不用每次創(chuàng)建Controller,二是減少了對(duì)象創(chuàng)建和垃圾收集的時(shí)間;由于只有一個(gè)Controller的instance,當(dāng)多個(gè)線程調(diào)用它的時(shí)候,它里面的instance變量就不是線程安全的了,會(huì)發(fā)生竄數(shù)據(jù)的問題。
如果我們定義了一個(gè)全局的實(shí)例,如privateCompanycompany=newCompany();而在@RequestMapping方法中去用到了他,這里就存在并發(fā)線程安全的問題。
對(duì)于所有的請(qǐng)求request,這個(gè)company對(duì)象是相通的。
當(dāng)然我們也可以用這個(gè)特性來制作訪問計(jì)數(shù)器只需要定義一個(gè)privateintcout=0;在每一次請(qǐng)求后cout++;
當(dāng)然我并不推薦這么做,計(jì)數(shù)器最好用redis來操作。
總結(jié)以上問題,不要在Controller里出現(xiàn)類的實(shí)例。即便加了線程安全操作,也會(huì)出現(xiàn)性能問題。當(dāng)然無論是Controller還是Service,如果你一定要使用對(duì)象的屬性,如privateCompanycompany=newCompany();可以加上ThreadLocal的引用,如privateThreadLocalCompanytc=newThreadLocal();但是把這種使用的對(duì)象放進(jìn)方法中初始化(即進(jìn)入JVM棧中更好)。
2.controller在多線程下如何盡可能保證線程安全,如何取舍
當(dāng)多個(gè)請(qǐng)求對(duì)controller進(jìn)行請(qǐng)求時(shí),它的instance的單例模式是線程不安全的,因此我們?nèi)绻WC完全的線程安全,需要對(duì)于每次請(qǐng)求都創(chuàng)建一個(gè)新的controller實(shí)例,在spring中使用@RequestScope注解定義它的作用域?yàn)閞equst,即一次請(qǐng)求即為一個(gè)實(shí)例,這樣就可以保證controller層面上的線程安全。但是這樣做會(huì)有一個(gè)很大的缺點(diǎn),就是這種方式當(dāng)并發(fā)很大時(shí),創(chuàng)建bean的新實(shí)例就比重用原有的controller實(shí)例要慢許多。
因此還有折中的辦法,就是將@RequestScope設(shè)置為session級(jí)別的作用域,這樣每當(dāng)一次會(huì)話,spring就會(huì)創(chuàng)建一個(gè)controller實(shí)例,而不需要每次請(qǐng)求都去創(chuàng)建一次實(shí)例,大大提高了訪問的速度,雖然這樣無法保證絕對(duì)的線程安全,但是在大部分的業(yè)務(wù)邏輯上都有效的防止了線程安全的問題。
此外,spring的作用域還有singleton(單例,也是spring默認(rèn)的作用域級(jí)別,即永遠(yuǎn)使用同一個(gè)實(shí)例)、prototype(原型)、globalSession(全局)
3.小結(jié)一下
Spring本身并沒有解決并發(fā)訪問的問題。如果bean的范圍不是線程安全的(例如在controller上面的成員變量或者靜態(tài)變量就是線程不安全的),但其方法包含一些您總是希望安全運(yùn)行的關(guān)鍵代碼或者使用了靜態(tài)字段需要對(duì)其進(jìn)行并發(fā)修改,請(qǐng)?jiān)谠摲椒ㄉ鲜褂胹ynchronized關(guān)鍵字?;蛘呤褂靡恍┯刑峁┚€程安全的集合進(jìn)行相應(yīng)的多線程操作。
單例模式與線程安全問題踩的坑
最近有客戶反映,使用公司產(chǎn)品時(shí),偶爾會(huì)存在崩潰情況,自己測(cè)試無問題,然后去查日志,是報(bào)空指針。于是順藤摸瓜往上找,好嘛,之前的開發(fā)使用了成員變量,感覺問題就是在這里了,因?yàn)楸娝苤瑂pringboot采用的是單例模式,所以,使用成員變量時(shí)一定要謹(jǐn)慎。
下面上一張?jiān)擃惖慕貓D
大家可能看到了,該類上面加上了@Scope("prototype")注解,該注解的作用是將該類變成多例模式。講道理因?yàn)樽優(yōu)榱硕嗬?,?yīng)該不會(huì)有線程問題了。
我先說下我這邊的一個(gè)代碼環(huán)境
上面大家看到的BaseController這個(gè)類里面有個(gè)init方法,會(huì)在繼承它的類的所有方法前執(zhí)行。
使用的是@ModelAttribute注解,這個(gè)注解的意思是,在該controller的所有方法前執(zhí)行,意在初始化,我猜測(cè)之前的同事應(yīng)該是為了獲取相同的一些參數(shù),抽調(diào)出來做一個(gè)父類,隨著迭代,別的同事為了方便,拿來就用,導(dǎo)致很多controller繼承了該類。
@Scope("prototype")注解:大家設(shè)想一下,若父類加了@Scope("prototype")注解,子類controller并沒有加該注解,會(huì)怎樣呢?該注解是否還有意義?再比如,我在某service上加上@Scope("prototype")注解,但調(diào)用的controller沒有加@Scope("prototype")注解,那么會(huì)出現(xiàn)什么樣的結(jié)果呢?大家可以去測(cè)試一下,測(cè)試方法也很簡單,就是在對(duì)應(yīng)的父類或service的無參構(gòu)造方法里打印該類的地址。
下面說下我的測(cè)試結(jié)果
先說父類上加了@Scope("prototype")注解,子類上沒有加這種情況。結(jié)果是,同一子類繼承的為同一父類,不同子類繼承為不同父類。理解一下,很簡單,因?yàn)閟pringboot為單例模式,所以子類為單例,那么只有一個(gè)子類,父類肯定是一樣的。所以,不同線程過來使用的為同一變量,就會(huì)有問題。
同理:在service上標(biāo)注@Scope("prototype")注解,那在同一個(gè)controller里,該service還是同一個(gè),也就是說還是單例的,在不同的controller里是不同的。測(cè)試方法同上。
現(xiàn)在說下解決方法
1、是在繼承該controller的子類上都加上@Scope("prototype")注解。這樣做的好處是簡單。壞處也同樣明顯,因?yàn)槭嵌嗬模敲淳蜁?huì)產(chǎn)生大量的實(shí)體類,占用大量內(nèi)存,若是回收不及時(shí),有可能會(huì)出現(xiàn)內(nèi)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全生產(chǎn)談心談話制度
- 規(guī)劃局安全生產(chǎn)工作制度
- 新疆克拉瑪依市北師大克拉瑪依附中2026屆英語高三上期末聯(lián)考試題含解析
- 罕見病藥物遞送載體抗體靶向
- 2026屆上海市交通大學(xué)附屬中學(xué)語文高三第一學(xué)期期末統(tǒng)考試題含解析
- 2025年杭州市蕭山區(qū)機(jī)關(guān)事業(yè)單位招聘筆試真題
- 發(fā)動(dòng)機(jī)的先進(jìn)技術(shù)
- 反恐怖主義教育培訓(xùn)課件
- 2026四川遂寧市船山區(qū)人民法院招聘司法輔助人員12人備考題庫及完整答案詳解一套
- 2026新疆生產(chǎn)建設(shè)兵團(tuán)第一師中級(jí)人民法院司法警務(wù)輔助人員招聘16人備考題庫(含答案詳解)
- 華為公司獎(jiǎng)罰管理制度
- 2026年安全員之A證考試題庫500道附答案(典型題)
- 2025-2030衛(wèi)星互聯(lián)網(wǎng)產(chǎn)業(yè)發(fā)展趨勢(shì)與戰(zhàn)略布局分析報(bào)告
- T-CACM 1637-2025 中醫(yī)證候療效評(píng)價(jià)技術(shù)規(guī)范
- 2025年日語能力測(cè)試N4級(jí)真題模擬備考試卷
- DB62∕T 4203-2020 云杉屬種質(zhì)資源異地保存庫營建技術(shù)規(guī)程
- 年終歲末的安全培訓(xùn)課件
- 中醫(yī)康復(fù)面試題目及答案
- 《人工智能導(dǎo)論》高職人工智能通識(shí)課程全套教學(xué)課件
- 中華醫(yī)學(xué)會(huì)麻醉學(xué)分會(huì)困難氣道管理指南
- 南京旅館住宿管理辦法
評(píng)論
0/150
提交評(píng)論