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

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

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

Spring單例和多例的理解

1、什么是單例和多例

單例:所有請求用同一個對象來處理。通過單例模式,可以保證系統(tǒng)中一個類只有一個實(shí)例。

多例:每個請求用一個新的對象來處理。

2、Spring中的單例與多例

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

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

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

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

當(dāng)有請求來的時候,會先從緩存(map)里查看有沒有,有的話直接使用這個對象,沒有的話才實(shí)例化一個新的對象,所以這是個單例的。

但是對于原型(prototype)bean來說,當(dāng)每次請求來的時候,會直接實(shí)例化新的bean,沒有緩存以及緩存查詢的過程。

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

優(yōu)勢:

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

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

劣勢:

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

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

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

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

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

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

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

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

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

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

如何解決線程安全問題?

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

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

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

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):共享一個實(shí)例,內(nèi)存占用少,GC開銷小
  • 缺點(diǎn):共享資源存在線程安全問題

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

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

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

相關(guān)文章

最新評論

景德镇市| 尚志市| 镇坪县| 廊坊市| 武清区| 嫩江县| 萍乡市| 阿拉善左旗| 海晏县| 罗平县| 银川市| 云林县| 石景山区| 神池县| 梅州市| 镇赉县| 威远县| 扶沟县| 周至县| 金门县| 白河县| 新竹市| 贵港市| 保山市| 鸡泽县| 山东省| 建始县| 开封县| 安陆市| 临湘市| 花垣县| 祁东县| 霞浦县| 湖北省| 金溪县| 庄河市| 高尔夫| 昔阳县| 盐山县| 仁布县| 措勤县|