溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

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

發(fā)布時(shí)間:2020-08-19 14:20:31 來(lái)源:腳本之家 閱讀:270 作者:flycw 欄目:編程語(yǔ)言

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

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

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

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

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

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

因?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ù),是非線(xiàn)程安全的。

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

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

向AI問(wèn)一下細(xì)節(jié)
AI