色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Controller并發安全的解決辦法

Android編程精選 ? 來源:今日頭條 ? 作者:微說互聯網 ? 2022-06-15 17:10 ? 次閱讀
單例模式(Singleton)是程序設計中一種非常重要的設計模式,設計模式也是Java面試重點考察的一個方面。面試經常會問到的一個問題是:SpringMVC中的Controller是單例還是多例,很多同學可能會想當然認為Controller是多例,其實不然。

根據Tomcat官網中的介紹,對于一個瀏覽器請求,tomcat會指定一個處理線程,或是在線程池中選取空閑的,或者新建一個線程。

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容器中,每個servlet是單例的。在SpringMVC中,Controller 默認也是單例。 采用單例模式的最大好處,就是可以在高并發場景下極大地節省內存資源,提高服務抗壓能力。

單例模式容易出現的問題是:在Controller中定義的實例變量,在多個請求并發時會出現競爭訪問,Controller中的實例變量不是線程安全的。

Controller不是線程安全的

正因為Controller默認是單例,所以不是線程安全的。如果用SpringMVC 的 Controller時,盡量不在 Controller中使用實例變量,否則會出現線程不安全性的情況,導致數據邏輯混亂。

舉一個簡單的例子,在一個Controller中定義一個非靜態成員變量 num 。通過Controller成員方法來對 num 增加。

@Controller
publicclassTestController{
privateintnum=0;

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

在本地運行后:

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

兩次訪問得到的結果不同,num已經被修改,并不是我們希望的結果,接口的冪等性被破壞。

從這個例子可以看出,所有的請求訪問同一個Controller實例,Controller的私有成員變量就是線程共用的。某個請求對應的線程如果修改了這個變量,那么在別的請求中也可以讀到這個變量修改后的的值

Controller并發安全的解決辦法

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

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

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

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

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

Scope屬性是用來聲明IOC容器中的對象(Bean )允許存在的限定場景,或者說是對象的存活空間。在對象進入相應的使用場景之前,IOC容器會生成并裝配這些對象;當該對象不再處于這些使用場景的限定時,容器通常會銷毀這些對象。

Controller也是一個Bean,默認的 Scope 屬性為Singleton ,也就是單例模式。如果Bean的 Scope 屬性設置為 prototype 的話,容器在接受到該類型對象的請求時,每次都會重新生成一個新的對象給請求方。

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

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

以上代碼運行以后,每次請求 http:// localhost:8080 / addNum , 得到的結果都是1。

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

總的來說,還是盡量不要在 Controller 中定義成員變量為好。

原文標題:如何保證 Controller 的并發安全

文章出處:【微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Controller
    +關注

    關注

    0

    文章

    398

    瀏覽量

    57470
  • singleton
    +關注

    關注

    0

    文章

    3

    瀏覽量

    5313
  • 線程安全
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2523
  • SpringMVC
    +關注

    關注

    0

    文章

    18

    瀏覽量

    5933

原文標題:如何保證 Controller 的并發安全

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    華碩筆記本聲卡驅動無法安裝的解決辦法

    華碩筆記本聲卡驅動無法安裝的解決辦法
    發表于 01-18 10:10 ?3625次閱讀

    聲卡硬件維修的常見問題及解決辦法

    聲卡硬件維修的常見問題及解決辦法 常見故障一:聲卡無聲   出現這種故障常見的原因有:
    發表于 02-23 14:25 ?2716次閱讀

    誤碼特性,誤碼產生的機理及解決辦法

    誤碼特性,誤碼產生的機理及解決辦法
    發表于 03-19 17:10 ?2424次閱讀

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

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

    Matlab編程常見錯誤與解決辦法

    Matlab編程常見錯誤與解決辦法求人不如求己
    發表于 03-16 15:58 ?0次下載

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

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

    ESP32勘誤表及解決辦法

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

    電腦右鍵管理打開失敗的解決辦法

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

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

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

    硬盤故障的3個終極解決辦法

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

    細碎機軸承位磨損問題的解決辦法

    【設備故障】細碎機軸承位磨損問題的解決辦法
    發表于 10-27 16:36 ?0次下載

    Protel99 與WIN10系統沖突解決辦法

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

    常見MCU故障及解決辦法

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

    常見墊圈故障及解決辦法 防漏墊圈的設計與應用

    常見墊圈故障及解決辦法 1. 墊圈老化 故障現象: 墊圈因長時間使用而老化,失去彈性,導致密封性能下降。 解決辦法: 定期檢查墊圈的老化情況,及時更換新的墊圈。 2. 墊圈變形 故障現象: 由于安裝
    的頭像 發表于 12-12 15:31 ?960次閱讀

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

    PLC(可編程邏輯控制器)異常工作的原因及解決辦法
    的頭像 發表于 02-24 17:27 ?833次閱讀
    主站蜘蛛池模板: 影音先锋亚洲AV少妇熟女 | 日本三级按摩推拿按摩 | 亚洲午夜久久久精品影院 | 久久久久久久伊人电影 | 精品视频中文字幕 | 国产亚洲精品久久综合阿香 | 99婷婷久久精品国产一区二区 | 久久精品国产免费中文 | 欧美日韩免费播放一区二区 | 久草青青在线 | 风车动漫(p)_在线观看官网 | 一本道久在线综合道 | 袖珍人与大黑人性视频 | 女厕所边摸边吃奶边做爽视频 | 国产在线精品亚洲观看不卡欧美 | 国精产品一区一区三区有限在线 | 欧美性狂猛bbbbbbxxxx | 99久久婷婷国产麻豆精品电影 | 中国xxxxxz | 正在播放一区二区 | 野花香HD免费高清版6高清版 | 暖暖免费观看日本在线视频 | 久久精品国产亚洲AV麻豆欧美玲 | 欧美日韩亚洲一区二区三区在线观看 | 成人天堂婷婷青青视频在线观看 | 成人在线不卡视频 | 岛国精品在线观看 | 国产扒开美女双腿屁股流白浆 | 久久精品一区二区免费看 | 欧美一级情欲片在线 | 亚洲AV久久久噜噜噜久久 | 欧洲日韩av无线在码 | 久久久性色精品国产免费观看 | 欧美阿v天堂视频在99线 | 久久在精品线影院精品国产 | 蜜桃传媒视频 | 伦理 电影在线观看百度影音 | 69xx欧美| 狠狠啪 日日啪 | 福利社的阿姨 | 国产网站免费观看 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品