99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Controller并發(fā)安全的解決辦法

Android編程精選 ? 來(lái)源:今日頭條 ? 作者:微說(shuō)互聯(lián)網(wǎng) ? 2022-06-15 17:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

單例模式(Singleton)是程序設(shè)計(jì)中一種非常重要的設(shè)計(jì)模式,設(shè)計(jì)模式也是Java面試重點(diǎn)考察的一個(gè)方面。面試經(jīng)常會(huì)問(wèn)到的一個(gè)問(wèn)題是:SpringMVC中的Controller是單例還是多例,很多同學(xué)可能會(huì)想當(dāng)然認(rèn)為Controller是多例,其實(shí)不然。

根據(jù)Tomcat官網(wǎng)中的介紹,對(duì)于一個(gè)瀏覽器請(qǐng)求,tomcat會(huì)指定一個(gè)處理線程,或是在線程池中選取空閑的,或者新建一個(gè)線程。

Each incoming request requires a thread for the duration of that request. If more simultaneous requests are received than can be handled by the currently available request processing threads, additional threads will be created up to the configured maximum (the value of the maxThreads attribute). If still more simultaneous requests are received, they are stacked up inside the server socket created by the Connector, up to the configured maximum (the value of the acceptCountattribute). Any further simultaneous requests will receive "connection refused" errors, until resources are available to process them.

—— https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

在Tomcat容器中,每個(gè)servlet是單例的。在SpringMVC中,Controller 默認(rèn)也是單例。 采用單例模式的最大好處,就是可以在高并發(fā)場(chǎng)景下極大地節(jié)省內(nèi)存資源,提高服務(wù)抗壓能力。

單例模式容易出現(xiàn)的問(wèn)題是:在Controller中定義的實(shí)例變量,在多個(gè)請(qǐng)求并發(fā)時(shí)會(huì)出現(xiàn)競(jìng)爭(zhēng)訪問(wèn),Controller中的實(shí)例變量不是線程安全的。

Controller不是線程安全的

正因?yàn)镃ontroller默認(rèn)是單例,所以不是線程安全的。如果用SpringMVC 的 Controller時(shí),盡量不在 Controller中使用實(shí)例變量,否則會(huì)出現(xiàn)線程不安全性的情況,導(dǎo)致數(shù)據(jù)邏輯混亂。

舉一個(gè)簡(jiǎn)單的例子,在一個(gè)Controller中定義一個(gè)非靜態(tài)成員變量 num 。通過(guò)Controller成員方法來(lái)對(duì) num 增加。

@Controller
publicclassTestController{
privateintnum=0;

@RequestMapping("/addNum")
publicvoidaddNum(){
System.out.println(++num);
}
}

在本地運(yùn)行后:

  • 首先訪問(wèn) http:// localhost:8080 / addNum,得到的答案是1;
  • 再次訪問(wèn) http:// localhost:8080 / addNum,得到的答案是 2。

兩次訪問(wèn)得到的結(jié)果不同,num已經(jīng)被修改,并不是我們希望的結(jié)果,接口的冪等性被破壞。

從這個(gè)例子可以看出,所有的請(qǐng)求訪問(wèn)同一個(gè)Controller實(shí)例,Controller的私有成員變量就是線程共用的。某個(gè)請(qǐng)求對(duì)應(yīng)的線程如果修改了這個(gè)變量,那么在別的請(qǐng)求中也可以讀到這個(gè)變量修改后的的值

Controller并發(fā)安全的解決辦法

如果要保證Controller的線程安全,有以下解決辦法:

  • 盡量不要在 Controller 中定義成員變量 ;

如果必須要定義一個(gè)非靜態(tài)成員變量,那么可以通過(guò)注解 @Scope(“prototype”) ,將Controller設(shè)置為多例模式。

@Controller
@Scope(value="prototype")
publicclassTestController{
privateintnum=0;

@RequestMapping("/addNum")
publicvoidaddNum(){
System.out.println(++num);
}
}

Scope屬性是用來(lái)聲明IOC容器中的對(duì)象(Bean )允許存在的限定場(chǎng)景,或者說(shuō)是對(duì)象的存活空間。在對(duì)象進(jìn)入相應(yīng)的使用場(chǎng)景之前,IOC容器會(huì)生成并裝配這些對(duì)象;當(dāng)該對(duì)象不再處于這些使用場(chǎng)景的限定時(shí),容器通常會(huì)銷毀這些對(duì)象。

Controller也是一個(gè)Bean,默認(rèn)的 Scope 屬性為Singleton ,也就是單例模式。如果Bean的 Scope 屬性設(shè)置為 prototype 的話,容器在接受到該類型對(duì)象的請(qǐng)求時(shí),每次都會(huì)重新生成一個(gè)新的對(duì)象給請(qǐng)求方。

  • Controller 中使用 ThreadLocal 變量。每一個(gè)線程都有一個(gè)變量的副本。
publicclassTestController{
privateintnum=0;
privatefinalThreadLocaluniqueNum=
newThreadLocal(){
@OverrideprotectedIntegerinitialValue(){
returnnum;
}
};

@RequestMapping("/addNum")
publicvoidaddNum(){
intunum=uniqueNum.get();
uniqueNum.set(++unum);
System.out.println(uniqueNum.get());
}
}

以上代碼運(yùn)行以后,每次請(qǐng)求 http:// localhost:8080 / addNum , 得到的結(jié)果都是1。

更嚴(yán)格的做法是用AtomicInteger類型定義成員變量,對(duì)于成員變量的操作使用AtomicInteger的自增方法完成。

總的來(lái)說(shuō),還是盡量不要在 Controller 中定義成員變量為好。

原文標(biāo)題:如何保證 Controller 的并發(fā)安全

文章出處:【微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Controller
    +關(guān)注

    關(guān)注

    0

    文章

    398

    瀏覽量

    57557
  • singleton
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    5324
  • 線程安全
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    2545
  • SpringMVC
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    5955

原文標(biāo)題:如何保證 Controller 的并發(fā)安全

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    華碩筆記本聲卡驅(qū)動(dòng)無(wú)法安裝的解決辦法

    華碩筆記本聲卡驅(qū)動(dòng)無(wú)法安裝的解決辦法
    發(fā)表于 01-18 10:10 ?3641次閱讀

    聲卡硬件維修的常見(jiàn)問(wèn)題及解決辦法

    聲卡硬件維修的常見(jiàn)問(wèn)題及解決辦法 常見(jiàn)故障一:聲卡無(wú)聲   出現(xiàn)這種故障常見(jiàn)的原因有:
    發(fā)表于 02-23 14:25 ?2750次閱讀

    誤碼特性,誤碼產(chǎn)生的機(jī)理及解決辦法

    誤碼特性,誤碼產(chǎn)生的機(jī)理及解決辦法
    發(fā)表于 03-19 17:10 ?2452次閱讀

    UPS電源輸入跳閘淺析及解決辦法

    UPS電源輸入跳閘淺析及解決辦法解析
    發(fā)表于 11-10 16:42 ?89次下載
    UPS電源輸入跳閘淺析及<b class='flag-5'>解決辦法</b>

    Matlab編程常見(jiàn)錯(cuò)誤與解決辦法

    Matlab編程常見(jiàn)錯(cuò)誤與解決辦法求人不如求己
    發(fā)表于 03-16 15:58 ?0次下載

    壓榨輥軸承位磨損有哪些解決辦法

    壓榨輥軸承位磨損有哪些解決辦法
    發(fā)表于 01-19 09:45 ?4次下載

    ESP32勘誤表及解決辦法

    電子發(fā)燒友網(wǎng)站提供《ESP32勘誤表及解決辦法.pdf》資料免費(fèi)下載
    發(fā)表于 09-23 11:51 ?0次下載
    ESP32勘誤表及<b class='flag-5'>解決辦法</b>

    電腦右鍵管理打開(kāi)失敗的解決辦法

    此電腦右鍵管理打不開(kāi)怎么辦 電腦右鍵管理打開(kāi)失敗的解決辦法
    發(fā)表于 09-28 09:56 ?0次下載

    J-Link連接MCU失敗解決辦法

    J-Link連接MCU失敗解決辦法
    的頭像 發(fā)表于 10-18 17:43 ?1597次閱讀
    J-Link連接MCU失敗<b class='flag-5'>解決辦法</b>

    硬盤故障的3個(gè)終極解決辦法

    電子發(fā)燒友網(wǎng)站提供《硬盤故障的3個(gè)終極解決辦法.pdf》資料免費(fèi)下載
    發(fā)表于 10-20 10:46 ?0次下載
    硬盤故障的3個(gè)終極<b class='flag-5'>解決辦法</b>

    細(xì)碎機(jī)軸承位磨損問(wèn)題的解決辦法

    【設(shè)備故障】細(xì)碎機(jī)軸承位磨損問(wèn)題的解決辦法
    發(fā)表于 10-27 16:36 ?0次下載

    Protel99 與WIN10系統(tǒng)沖突解決辦法

    PROTEL99 與WIN10系統(tǒng)沖突解決辦法
    的頭像 發(fā)表于 11-20 09:30 ?5324次閱讀
    Protel99 與WIN10系統(tǒng)沖突<b class='flag-5'>解決辦法</b>

    常見(jiàn)MCU故障及解決辦法

    微控制器單元(MCU)是現(xiàn)代電子設(shè)備中的核心組件,負(fù)責(zé)處理和控制各種功能。然而,由于各種原因,MCU可能會(huì)出現(xiàn)故障。以下是一些常見(jiàn)的MCU故障及其解決辦法: 1. 電源問(wèn)題 故障現(xiàn)象: MCU無(wú)法
    的頭像 發(fā)表于 11-01 13:41 ?7252次閱讀

    常見(jiàn)墊圈故障及解決辦法 防漏墊圈的設(shè)計(jì)與應(yīng)用

    常見(jiàn)墊圈故障及解決辦法 1. 墊圈老化 故障現(xiàn)象: 墊圈因長(zhǎng)時(shí)間使用而老化,失去彈性,導(dǎo)致密封性能下降。 解決辦法: 定期檢查墊圈的老化情況,及時(shí)更換新的墊圈。 2. 墊圈變形 故障現(xiàn)象: 由于安裝
    的頭像 發(fā)表于 12-12 15:31 ?1039次閱讀

    PLC異常工作的原因和解決辦法

    PLC(可編程邏輯控制器)異常工作的原因及解決辦法。
    的頭像 發(fā)表于 02-24 17:27 ?994次閱讀