這篇文章主要介紹“Spring中單例模式的線(xiàn)程怎么保持安全狀態(tài)”,在日常操作中,相信很多人在Spring中單例模式的線(xiàn)程怎么保持安全狀態(tài)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Spring中單例模式的線(xiàn)程怎么保持安全狀態(tài)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出新平免費(fèi)做網(wǎng)站回饋大家。
Spring 中管理的 Bean 實(shí)例默認(rèn)情況下是單例的(sigleton 類(lèi)型),但 Spring 中的單例并不會(huì)影響應(yīng)用的并發(fā)訪(fǎng)問(wèn)。
E.g. 從客戶(hù)端傳遞到后臺(tái) controller - Service - Dao 這一個(gè)流程中,它們這些對(duì)象都是單例的,那么這些單例的對(duì)象在傳遞實(shí)體 bean 時(shí)不會(huì)出問(wèn)題么?
由于實(shí)體 bean 不是單例的,并沒(méi)有交給 Spring 來(lái)管理,每次都是手動(dòng)的 New 出來(lái)的,所以即使那些處理數(shù)據(jù)的業(yè)務(wù)處理類(lèi)是被多線(xiàn)程共享的,但是它們處理的數(shù)據(jù)并不是共享的,數(shù)據(jù)是每一個(gè)線(xiàn)程都有自己的一份,所以在數(shù)據(jù)這個(gè)方面是不會(huì)出現(xiàn)線(xiàn)程同步方面的問(wèn)題的。
在 Controller 中引用的 Service,這些對(duì)象都是單例,但這些類(lèi)里通常不會(huì)含有成員變量,所以不會(huì)出現(xiàn)線(xiàn)程同步問(wèn)題了。
在一般情況下,只有無(wú)狀態(tài)的 Bean 才可以在多線(xiàn)程環(huán)境下共享,在 Spring 中,絕大部分 Bean 都可以聲明為 singleton 作用域,就是因?yàn)?Spring 對(duì)一些 Bean 中非線(xiàn)程安全狀態(tài)采用 ThreadLocal 進(jìn)行處理,讓它們也成為線(xiàn)程安全的狀態(tài)。
我們通過(guò) JVM 的層面來(lái)分析 Spring 單例下的線(xiàn)程安全問(wèn)題,下圖:
我們知道 Struts2 不是單例模式的,每一個(gè) Request 到達(dá)后臺(tái),Struts2 都會(huì)建立一個(gè)單獨(dú)的線(xiàn)程,而 Spring 管理的 Bean 在后臺(tái)應(yīng)用啟動(dòng)時(shí),則就會(huì)被初始化。
在 JVM 中,每一個(gè) Thread 對(duì)應(yīng)一個(gè)線(xiàn)程棧,每個(gè)方法對(duì)應(yīng)線(xiàn)程棧中的一個(gè)棧幀。而 Spring 管理的 Bean 初始化被保存在 JVM 的 Heap 中。
當(dāng) Strut2 中的一個(gè) Action 中引用 Spring 的 Bean 時(shí),對(duì)應(yīng)在每個(gè)線(xiàn)程棧中引用到的這個(gè) Bean,都指向 Heap 中的同一個(gè)地址空間。假設(shè)這個(gè) Bean 中有一個(gè)變量 temp,并有 setTemp 和 getTemp 方法,那么在多線(xiàn)程的情況下對(duì) temp 賦值和取值,則會(huì)出現(xiàn)數(shù)據(jù)不一致的問(wèn)題。
到此,關(guān)于“Spring中單例模式的線(xiàn)程怎么保持安全狀態(tài)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!