最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中單例和多例的深入理解

 更新時(shí)間:2021年08月04日 10:31:52   作者:tanwenfang  
這篇文章主要介紹了Spring中單例和多例的深入理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring單例和多例的理解

1、什么是單例和多例

單例:所有請(qǐng)求用同一個(gè)對(duì)象來(lái)處理。通過(guò)單例模式,可以保證系統(tǒng)中一個(gè)類(lèi)只有一個(gè)實(shí)例。

多例:每個(gè)請(qǐng)求用一個(gè)新的對(duì)象來(lái)處理。

2、Spring中的單例與多例

spring ioc容器的bean都是默認(rèn)單例的,即spring依賴(lài)注入Bean實(shí)例默認(rèn)是單例的。

spring提供了5中scope,分別是singleton,prototype,request,session,global session,常用是前兩種。點(diǎn)此查看官網(wǎng)介紹。

單例bean與多例(原型)bean的區(qū)別:

如果一個(gè)bean被聲明為單例的時(shí)候,在處理多次請(qǐng)求的時(shí)候,在spring容器里只實(shí)例化出一個(gè)bean,后續(xù)的請(qǐng)求都公用這個(gè)對(duì)象,這個(gè)對(duì)象會(huì)保存在一個(gè)map里面。

當(dāng)有請(qǐng)求來(lái)的時(shí)候,會(huì)先從緩存(map)里查看有沒(méi)有,有的話直接使用這個(gè)對(duì)象,沒(méi)有的話才實(shí)例化一個(gè)新的對(duì)象,所以這是個(gè)單例的。

但是對(duì)于原型(prototype)bean來(lái)說(shuō),當(dāng)每次請(qǐng)求來(lái)的時(shí)候,會(huì)直接實(shí)例化新的bean,沒(méi)有緩存以及緩存查詢(xún)的過(guò)程。

3、單例的優(yōu)勢(shì)與劣勢(shì)

優(yōu)勢(shì):

由于不會(huì)創(chuàng)建新的對(duì)象,所以有以下幾個(gè)性能上的優(yōu)勢(shì):

  • 減少新生成實(shí)例的消耗。新生成實(shí)例包括兩個(gè)方面,第一,spring會(huì)通過(guò)反射或者cglib來(lái)生成bean實(shí)例,這都是耗性能的操作。第二,給對(duì)象分配內(nèi)存也會(huì)涉及負(fù)責(zé)算法。
  • 減少jvm垃圾回收。由于不會(huì)給每個(gè)請(qǐng)求都生成bean實(shí)例,所以回收的對(duì)象就少了。
  • 可以快速獲取到bean。因?yàn)閱卫@取bean操作,除了第一次生成之外,其余都是從緩存里獲取的,所以很快。

劣勢(shì):

一個(gè)很大的劣勢(shì)是它不能做到線程安全。由于所有請(qǐng)求都共享一個(gè)bean實(shí)例,那么如果這個(gè)bean是一個(gè)有狀態(tài)的bean的話,在并發(fā)場(chǎng)景下就有可能出現(xiàn)問(wèn)題。

4、spring單例模式與線程安全:

當(dāng)多用戶(hù)同時(shí)請(qǐng)求一個(gè)服務(wù)時(shí),容器會(huì)給每一個(gè)請(qǐng)求分配一個(gè)線程,這時(shí)多個(gè)線程會(huì)并發(fā)執(zhí)行該請(qǐng)求所對(duì)應(yīng)的業(yè)務(wù)邏輯(成員方法),此時(shí)就要注意了,如果該處理邏輯中有對(duì)該單例狀態(tài)的修改(體現(xiàn)為該單例的成員屬性),則必須考慮線程同步問(wèn)題(此時(shí)該狀態(tài)就是一個(gè)臨界資源(共享數(shù)據(jù)),如果多個(gè)線程同時(shí)操作(修改)這個(gè)臨界資源就會(huì)誘發(fā)線程安全問(wèn)題)。

線程安全:如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行的結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。或者說(shuō):一個(gè)類(lèi)或者程序所提供的接口對(duì)于線程來(lái)說(shuō)是原子操作,或者多線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,就是線程安全的。

線程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的。

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

  • 常量始終是線程安全的,因?yàn)橹淮嬖谧x操作;
  • 每次調(diào)用方法前都新建一個(gè)實(shí)例是線程安全的,因?yàn)椴粫?huì)訪問(wèn)共享的資源;
  • 局部變量是線程安全的。因?yàn)槊繄?zhí)行一個(gè)方法,都會(huì)在獨(dú)立的空間創(chuàng)建局部變量,它不是共享資源。局部變量包括方法的參數(shù)變量和方法內(nèi)的變量。

在關(guān)于spring單例與線程安全的很多文章中,會(huì)提到一個(gè)概念,即有狀態(tài)bean和無(wú)狀態(tài)bean。

無(wú)狀態(tài)bean:無(wú)狀態(tài),就是一次操作,不能保存數(shù)據(jù)。無(wú)狀態(tài)bean,就是沒(méi)有實(shí)例變量的對(duì)象,不能保存數(shù)據(jù),是不變類(lèi),在線程安全的。

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

如何解決線程安全問(wèn)題?

(1)使用線程同步機(jī)制:通過(guò)對(duì)象的鎖機(jī)制保證同一時(shí)間只有一個(gè)線程訪問(wèn)變量。這時(shí)該變量是多個(gè)線程共享的,使用同步機(jī)制要求程序縝密地分析什么時(shí)候?qū)ψ兞窟M(jìn)行讀寫(xiě),什么時(shí)候需要鎖定某個(gè)對(duì)象,什么時(shí)候釋放對(duì)象鎖等繁雜問(wèn)題,程序設(shè)計(jì)和編寫(xiě)難度相對(duì)較大。

(2)使用ThreadLocal:為每一個(gè)線程提供一個(gè)獨(dú)立的變量副本,從而隔離了多個(gè)線程對(duì)數(shù)據(jù)的訪問(wèn)沖突。因?yàn)槊恳粋€(gè)線程都擁有自己的變量副本,從而也就沒(méi)有必要對(duì)該變量進(jìn)行同步了。

概括起來(lái)就是:對(duì)于多線程資源共享的問(wèn)題,同步機(jī)制采用了“以時(shí)間換空間”的方式,而ThreadLocal采用了“以空間換時(shí)間”的方式。前者僅提供一份變量,讓不同的線程排隊(duì)訪問(wèn),而后者為每一個(gè)線程都提供了一份變量,因此可以同時(shí)訪問(wèn)而互不影響。

5、單例如何變多例

Scope聲明為prototype,即

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

SpringMVC單例和多例的優(yōu)缺點(diǎn)

默認(rèn)是單例模式可設(shè)置為多例模式,兩種模式的優(yōu)缺點(diǎn):

1、單例模式(單例多線程的)

  • 優(yōu)點(diǎn):共享一個(gè)實(shí)例,內(nèi)存占用少,GC開(kāi)銷(xiāo)小
  • 缺點(diǎn):共享資源存在線程安全問(wèn)題

2、多例模式(單線程的)

  • 優(yōu)點(diǎn):不存在線程安全問(wèn)題(靜態(tài)共享資源除外)
  • 缺點(diǎn):多個(gè)實(shí)例,內(nèi)存占用多,GC開(kāi)銷(xiāo)大

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

屯门区| 繁峙县| 西盟| 连平县| 鹿邑县| 额济纳旗| 托克托县| 鹿泉市| 霍州市| 安宁市| 河源市| 浠水县| 大庆市| 华池县| 祥云县| 巴中市| 万年县| 大城县| 晋州市| 谷城县| 滦南县| 田东县| 庄浪县| 内黄县| 施甸县| 张家港市| 屏南县| 达日县| 黄冈市| 威信县| 子洲县| 庆云县| 平远县| 扎鲁特旗| 黔西县| 普安县| 留坝县| 弋阳县| 郧西县| 松溪县| 兴城市|