Java單例模式線程安全問(wèn)題-創(chuàng)新互聯(lián)

Java 單例模式線程安全問(wèn)題

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)萬(wàn)載免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

SpringIOC容器默認(rèn)提供bean的訪問(wèn)作用域是單例模式。即在整個(gè)application生命周期中,只有一個(gè)instance。因此在多線程并發(fā)下,會(huì)有線程安全風(fēng)險(xiǎn)。我們?cè)贛VC框架下的servlet就是線程安全的。由于該servlet是在客戶端,多并發(fā)相對(duì)少,但是對(duì)于web service端,需要考慮到。

ThreadLocal類:為每一個(gè)線程提供了一個(gè)獨(dú)立的變量(實(shí)例)副本,從各將各個(gè)不同的實(shí)例訪問(wèn)isolation。
在同步鎖機(jī)制中,后來(lái)者線程等待先行線程完成后,才能訪問(wèn)該成員變量。而ThreadLocal實(shí)現(xiàn)實(shí)例的復(fù)制而隔離對(duì)象訪問(wèn)數(shù)據(jù)沖突。同時(shí)也能夠少量解決scope為prototype訪問(wèn)模式下大量實(shí)例生命周期管理的消耗和負(fù)擔(dān)。是“以時(shí)間換空間”和“以空間換時(shí)間”的兩種實(shí)現(xiàn)。前者僅提供唯一變量,讓不同的線程排隊(duì)訪問(wèn),而后者為每一個(gè)線程都提供了一份拷貝,因此可以同時(shí)訪問(wèn)而互不影響,同時(shí)該拷貝存儲(chǔ)于內(nèi)存中,下次再次訪問(wèn)時(shí)候不再重新生成實(shí)例,減少服務(wù)器資源消耗。 


我們知道在一般情況下,只有無(wú)狀態(tài)的Bean才可以在多線程環(huán)境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域。就是因?yàn)镾pring對(duì)一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非線程安全狀態(tài)采用ThreadLocal進(jìn)行處理,讓它們也成為線程安全的狀態(tài),因?yàn)橛袪顟B(tài)的Bean就可以在多線程中共享了。

線程安全問(wèn)題:由全局變量及靜態(tài)變量引起,若每個(gè)線程中對(duì)全局變量、靜態(tài)變量只有讀操作,而無(wú)寫操作,一般來(lái)說(shuō),這個(gè)全局變量是線程安全的;若有多個(gè)線程同時(shí)執(zhí)行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。


1) 常量始終是線程安全的 (值恒定)
2)每次調(diào)用方法前都新建一個(gè)實(shí)例是線程安全的。(不同實(shí)例相互隔離)
3)局部變量是線程安全的(隔離)


因?yàn)槊繄?zhí)行一個(gè)方法,都會(huì)在獨(dú)立的空間創(chuàng)建局部變量,它不是共享的資源。局部變量包括方法的參數(shù)變量和方法內(nèi)變量。

有狀態(tài):有數(shù)據(jù)存儲(chǔ)、更改功能。有狀態(tài)對(duì)象(Stateful Bean),有實(shí)例變量的對(duì)象  ,可以保存數(shù)據(jù),是非線程安全的。


無(wú)狀態(tài):就是一次操作,不能變更數(shù)據(jù)。無(wú)狀態(tài)對(duì)象(Stateless Bean),沒(méi)有實(shí)例變量的對(duì)象,不能保存數(shù)據(jù),是不變類,是線程安全的。在spring中單例模式是共享實(shí)例,以達(dá)到提高性能。有狀態(tài)的Bean,多線程環(huán)境下不安全,那么適合用Prototype原型模式。Prototype: 每次對(duì)bean的請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的bean實(shí)例。

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

分享文章:Java單例模式線程安全問(wèn)題-創(chuàng)新互聯(lián)
文章出自:http://www.muchs.cn/article20/shojo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)營(yíng)銷型網(wǎng)站建設(shè)、定制網(wǎng)站關(guān)鍵詞優(yōu)化、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作