javascript
controller如何保证当前只有一个线程执行_聊聊Spring线程安全,读完之后,大部分程序员收藏了......
Spring作為一個(gè)IOC/DI容器,幫助我們管理了許許多多的“bean”。但其實(shí),Spring并沒有保證這些對(duì)象的線程安全,需要由開發(fā)者自己編寫解決線程安全問題的代碼。
Spring對(duì)每個(gè)bean提供了一個(gè)scope屬性來表示該bean的作用域。它是bean的生命周期。例如,一個(gè)scope為singleton的bean,在第一次被注入時(shí),會(huì)創(chuàng)建為一個(gè)單例對(duì)象,該對(duì)象會(huì)一直被復(fù)用到應(yīng)用結(jié)束。
- singleton:默認(rèn)的scope,每個(gè)scope為singleton的bean都會(huì)被定義為一個(gè)單例對(duì)象,該對(duì)象的生命周期是與Spring IOC容器一致的(但在第一次被注入時(shí)才會(huì)創(chuàng)建)。
- prototype:bean被定義為在每次注入時(shí)都會(huì)創(chuàng)建一個(gè)新的對(duì)象。
- request:bean被定義為在每個(gè)HTTP請(qǐng)求中創(chuàng)建一個(gè)單例對(duì)象,也就是說在單個(gè)請(qǐng)求中都會(huì)復(fù)用這一個(gè)單例對(duì)象。
- session:bean被定義為在一個(gè)session的生命周期內(nèi)創(chuàng)建一個(gè)單例對(duì)象。
- application:bean被定義為在ServletContext的生命周期中復(fù)用一個(gè)單例對(duì)象。
- websocket:bean被定義為在websocket的生命周期中復(fù)用一個(gè)單例對(duì)象。
我們交由Spring管理的大多數(shù)對(duì)象其實(shí)都是一些無狀態(tài)的對(duì)象,這種不會(huì)因?yàn)槎嗑€程而導(dǎo)致狀態(tài)被破壞的對(duì)象很適合Spring的默認(rèn)scope,每個(gè)單例的無狀態(tài)對(duì)象都是線程安全的(也可以說只要是無狀態(tài)的對(duì)象,不管單例多例都是線程安全的,不過單例畢竟節(jié)省了不斷創(chuàng)建對(duì)象與GC的開銷)。
無狀態(tài)的對(duì)象即是自身沒有狀態(tài)的對(duì)象,自然也就不會(huì)因?yàn)槎鄠€(gè)線程的交替調(diào)度而破壞自身狀態(tài)導(dǎo)致線程安全問題。無狀態(tài)對(duì)象包括我們經(jīng)常使用的DO、DTO、VO這些只作為數(shù)據(jù)的實(shí)體模型的貧血對(duì)象,還有Service、DAO和Controller,這些對(duì)象并沒有自己的狀態(tài),它們只是用來執(zhí)行某些操作的。例如,每個(gè)DAO提供的函數(shù)都只是對(duì)數(shù)據(jù)庫(kù)的CRUD,而且每個(gè)數(shù)據(jù)庫(kù)Connection都作為函數(shù)的局部變量(局部變量是在用戶棧中的,而且用戶棧本身就是線程私有的內(nèi)存區(qū)域,所以不存在線程安全問題),用完即關(guān)(或交還給連接池)。
有人可能會(huì)認(rèn)為,我使用request作用域不就可以避免每個(gè)請(qǐng)求之間的安全問題了嗎?這是完全錯(cuò)誤的,因?yàn)镃ontroller默認(rèn)是單例的,一個(gè)HTTP請(qǐng)求是會(huì)被多個(gè)線程執(zhí)行的,這就又回到了線程的安全問題。當(dāng)然,你也可以把Controller的scope改成prototype,實(shí)際上Struts2就是這么做的,但有一點(diǎn)要注意,Spring MVC對(duì)請(qǐng)求的攔截粒度是基于每個(gè)方法的,而Struts2是基于每個(gè)類的,所以把Controller設(shè)為多例將會(huì)頻繁的創(chuàng)建與回收對(duì)象,嚴(yán)重影響到了性能。
關(guān)注
感謝閱讀,如果這篇文章幫助了您,歡迎 點(diǎn)贊 ,收藏,關(guān)注,轉(zhuǎn)發(fā) 喲。您的幫助是我們前行的動(dòng)力,我們會(huì)提供更多有價(jià)值的內(nèi)容給大家... 謝謝!
總結(jié)
以上是生活随笔為你收集整理的controller如何保证当前只有一个线程执行_聊聊Spring线程安全,读完之后,大部分程序员收藏了......的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工程打包是什么意思_太生动形象了!500
- 下一篇: android 枚举类型比较大小写,Sp