<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring 的 Controller 是單例還是多例?怎么保證并發(fā)的安全

          共 2395字,需瀏覽 5分鐘

           ·

          2020-09-05 01:29

          點擊上方藍色“程序猿DD”,選擇“設(shè)為星標”

          回復(fù)“資源”獲取獨家整理的學(xué)習(xí)資料!

          作者 |?riemann_

          來源 |?blog.csdn.net/riemann_/article/details/97698560

          答案

          controller默認是單例的,不要使用非靜態(tài)的成員變量,否則會發(fā)生數(shù)據(jù)邏輯混亂。正因為單例所以不是線程安全的。

          我們下面來簡單的驗證下:

          package?com.riemann.springbootdemo.controller;

          import?org.springframework.context.annotation.Scope;
          import?org.springframework.stereotype.Controller;
          import?org.springframework.web.bind.annotation.RequestMapping;

          /**
          ?*?@author?riemann
          ?*?@date?2019/07/29?22:56
          ?*/

          @Controller
          public?class?ScopeTestController?{

          ????private?int?num?=?0;

          ????@RequestMapping("/testScope")
          ????public?void?testScope()?{
          ????????System.out.println(++num);
          ????}

          ????@RequestMapping("/testScope2")
          ????public?void?testScope2()?{
          ????????System.out.println(++num);
          ????}

          }

          我們首先訪問?http://localhost:8080/testScope,得到的答案是1;然后我們再訪問?http://localhost:8080/testScope2,得到的答案是?2

          得到的不同的值,這是線程不安全的。

          接下來我們再來給controller增加作用多例?@Scope("prototype")

          package?com.riemann.springbootdemo.controller;

          import?org.springframework.context.annotation.Scope;
          import?org.springframework.stereotype.Controller;
          import?org.springframework.web.bind.annotation.RequestMapping;

          /**
          ?*?@author?riemann
          ?*?@date?2019/07/29?22:56
          ?*/

          @Controller
          @Scope("prototype")
          public?class?ScopeTestController?{

          ????private?int?num?=?0;

          ????@RequestMapping("/testScope")
          ????public?void?testScope()?{
          ????????System.out.println(++num);
          ????}

          ????@RequestMapping("/testScope2")
          ????public?void?testScope2()?{
          ????????System.out.println(++num);
          ????}

          }

          我們依舊首先訪問?http://localhost:8080/testScope,得到的答案是1;然后我們再訪問?http://localhost:8080/testScope2,得到的答案還是?1

          相信大家不難發(fā)現(xiàn) :

          單例是不安全的,會導(dǎo)致屬性重復(fù)使用。

          推薦一個DD寫的SpringBoot基礎(chǔ)教程:http://blog.didispace.com/spring-boot-learning-2x/

          解決方案

          1、不要在controller中定義成員變量。2、萬一必須要定義一個非靜態(tài)成員變量時候,則通過注解@Scope(“prototype”),將其設(shè)置為多例模式。3、在Controller中使用ThreadLocal變量

          補充說明

          spring bean作用域有以下5個:

          • singleton:單例模式,當(dāng)spring創(chuàng)建applicationContext容器的時候,spring會欲初始化所有的該作用域?qū)嵗由蟣azy-init就可以避免預(yù)處理;

          • prototype:原型模式,每次通過getBean獲取該bean就會新產(chǎn)生一個實例,創(chuàng)建后spring將不再對其管理;

            (下面是在web項目下才用到的)

          • request:搞web的大家都應(yīng)該明白request的域了吧,就是每次請求都新產(chǎn)生一個實例,和prototype不同就是創(chuàng)建后,接下來的管理,spring依然在監(jiān)聽;

          • session:每次會話,同上;

          • global session:全局的web域,類似于servlet中的application。

          往期推薦

          臥槽!竟然可以直接白嫖 Github Action 的 2C7G 服務(wù)器!

          阿里取消“P”序列職級顯示引熱議,網(wǎng)友:P3、P4流下了感動的淚水

          RocketMQ 消息丟失場景及解決辦法

          IntelliJ IDEA 2020.2.1 發(fā)布,Lombok插件可能被官方支持

          思科前員工離職后刪庫,直接損失達 240 萬美元


          離職后與大家在星球聊了很多,你不來看看?

          我的星球是否適合你?

          點擊閱讀原文看看我們都聊過啥?

          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  污污污污网站 | 久久精品久久精品 | 亚洲日本欧美视频 | 黄色77777 | 福利在线色 |