Java 單例模式線程安全問題
Java 單例模式線程安全問題
SpringIOC容器默認提供bean的訪問作用域是單例模式。即在整個application生命周期中,只有一個instance。因此在多線程并發(fā)下,會有線程安全風險。我們在MVC框架下的servlet就是線程安全的。由于該servlet是在客戶端,多并發(fā)相對少,但是對于web service端,需要考慮到。
ThreadLocal類:為每一個線程提供了一個獨立的變量(實例)副本,從各將各個不同的實例訪問isolation。
在同步鎖機制中,后來者線程等待先行線程完成后,才能訪問該成員變量。而ThreadLocal實現(xiàn)實例的復制而隔離對象訪問數(shù)據(jù)沖突。同時也能夠少量解決scope為prototype訪問模式下大量實例生命周期管理的消耗和負擔。是“以時間換空間”和“以空間換時間”的兩種實現(xiàn)。前者僅提供唯一變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份拷貝,因此可以同時訪問而互不影響,同時該拷貝存儲于內(nèi)存中,下次再次訪問時候不再重新生成實例,減少服務器資源消耗。
我們知道在一般情況下,只有無狀態(tài)的Bean才可以在多線程環(huán)境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域。就是因為Spring對一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非線程安全狀態(tài)采用ThreadLocal進行處理,讓它們也成為線程安全的狀態(tài),因為有狀態(tài)的Bean就可以在多線程中共享了。
線程安全問題:由全局變量及靜態(tài)變量引起,若每個線程中對全局變量、靜態(tài)變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執(zhí)行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。
1) 常量始終是線程安全的 (值恒定)
2)每次調(diào)用方法前都新建一個實例是線程安全的。(不同實例相互隔離)
3)局部變量是線程安全的(隔離)
因為每執(zhí)行一個方法,都會在獨立的空間創(chuàng)建局部變量,它不是共享的資源。局部變量包括方法的參數(shù)變量和方法內(nèi)變量。
有狀態(tài):有數(shù)據(jù)存儲、更改功能。有狀態(tài)對象(Stateful Bean),有實例變量的對象 ,可以保存數(shù)據(jù),是非線程安全的。
無狀態(tài):就是一次操作,不能變更數(shù)據(jù)。無狀態(tài)對象(Stateless Bean),沒有實例變量的對象,不能保存數(shù)據(jù),是不變類,是線程安全的。在spring中單例模式是共享實例,以達到提高性能。有狀態(tài)的Bean,多線程環(huán)境下不安全,那么適合用Prototype原型模式。Prototype: 每次對bean的請求都會創(chuàng)建一個新的bean實例。
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Java數(shù)據(jù)結(jié)構(gòu)順序表用法詳解
順序表是計算機內(nèi)存中以數(shù)組的形式保存的線性表,線性表的順序存儲是指用一組地址連續(xù)的存儲單元依次存儲線性表中的各個元素、使得線性表中在邏輯結(jié)構(gòu)上相鄰的數(shù)據(jù)元素存儲在相鄰的物理存儲單元中,即通過數(shù)據(jù)元素物理存儲的相鄰關系來反映數(shù)據(jù)元素之間邏輯上的相鄰關系2021-10-10
SQL注入攻擊及其在SpringBoot中使用MyBatisPlus的防范策略的方法
本文介紹了如何使用SpringBoot整合JavaDeeplearning4j構(gòu)建一個文本摘要生成系統(tǒng),該系統(tǒng)能夠自動從長篇文本中提取關鍵信息,生成簡潔的摘要,幫助用戶快速了解文本的主要內(nèi)容,系統(tǒng)使用LSTM神經(jīng)網(wǎng)絡模型進行訓練,并通過SpringBoot創(chuàng)建RESTful?API進行調(diào)用2024-11-11
老生常談JVM的內(nèi)存溢出說明及參數(shù)調(diào)整
下面小編就為大家?guī)硪黄仙U凧VM的內(nèi)存溢出說明及參數(shù)調(diào)整。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
java 驗證用戶是否已經(jīng)登錄與實現(xiàn)自動登錄方法詳解
本文主要介紹了java 驗證用戶是否已經(jīng)登錄與實現(xiàn)自動登錄的方法。具有一定的參考價值,下面跟著小編一起來看下吧2017-01-01

