<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 MVC 中的 Controller 是線程安全的嗎?

          共 1733字,需瀏覽 4分鐘

           ·

          2022-05-25 09:23

          往期熱門文章:

          1、Gitee 倒下了???

          2、再見付費(fèi)的 TeamViewer,這款國(guó)產(chǎn)輕量級(jí)遠(yuǎn)程控制軟件是絕佳的替代品!

          3、Mybatis-Plus官方發(fā)布分庫(kù)分表神器,一個(gè)依賴輕松搞定!

          4、Java 中的 BigDecimal,80% 的人竟然都用錯(cuò)了。。。

          5、從5秒優(yōu)化到1秒,系統(tǒng)飛起來了...

          經(jīng)常有面試題問到 Spring MVC 中的 Controller 是線程安全的嗎?
          在回答這個(gè)問題之前我們需要先了解一下,什么是線程安全?
          下面這個(gè)圖是來解釋一下什么是多線程,紅色的是 CPU 計(jì)算,藍(lán)色的是 IO 操作,橫坐標(biāo)是時(shí)間,縱坐標(biāo)是線程,那么我們可以發(fā)現(xiàn),多線程是通過時(shí)間片的輪轉(zhuǎn)切換上下文運(yùn)行的,換句話說,就是同一時(shí)刻會(huì)有多個(gè)線程“同時(shí)運(yùn)行”,這就是多線程。
          引用:極客時(shí)間《Java 并發(fā)編程實(shí)戰(zhàn)》
          那么線程安全是什么呢?通俗點(diǎn)解釋,當(dāng)多個(gè)線程訪問某個(gè)方法時(shí),不會(huì)受其他線程影響,不管你通過怎樣的方式調(diào)用返回結(jié)果都是我們期望的結(jié)果。寫一個(gè)非常簡(jiǎn)單的例子來看一下什么是線程不安全
          import?java.util.Random;

          public?class?ThreadTest?{
          ????private?int?count;

          ????@SneakyThrows
          ????public?int?incCount()?{
          ????????Thread.sleep(new?Random().nextInt(500));
          ????????return?count++;
          ????}

          ????public?static?void?main(String[]?args)?{
          ????????ThreadTest?threadTest?=?new?ThreadTest();
          ????????for?(int?i?=?0;?i?100;?i++)?{
          ????????????new?Thread(()?->?System.out.println(threadTest.incCount())).start();
          ????????}
          ????}
          }
          非常簡(jiǎn)單的例子,我們可以理解成是頁(yè)面的閱讀數(shù),100 個(gè)人并發(fā)訪問,最終返回頁(yè)面的訪問總數(shù),結(jié)果出現(xiàn)了重復(fù)的 12(其他重復(fù)省略),最終是 90,那么是不是我們期望的是 99 才對(duì)?這就是線程不安全。
          0
          1
          2
          3
          4
          5
          6
          8
          7
          9
          10
          11
          13
          12
          12
          14
          15
          ……
          90
          我們?nèi)绾慰焖俚慕鉀Q這個(gè)問題呢?
          添加 synchronized 關(guān)鍵字,synchronized 是同步的意思,表示無論你有多少線程,必須同步等待其他線程結(jié)束以后才能訪問這個(gè)方法,問題是解決了,但是你運(yùn)行程序的時(shí)候會(huì)發(fā)現(xiàn),打印非常慢。
          @SneakyThrows
          public?synchronized?int?incCount()?{
          ????Thread.sleep(new?Random().nextInt(500));
          ????return?count++;
          }
          到這里線程安全說的差不多了,那我們還是回到 Spring MVC 的 Controller。是不是現(xiàn)在你已經(jīng)明白了,Controller 它一定是線程不安全的。首先 Controller 是一個(gè)單例,其次每一次請(qǐng)求也是一個(gè)線程,那么如果在 Controller 中有變量的話一定會(huì)導(dǎo)致數(shù)據(jù)不準(zhǔn)確。
          那么如何解決呢?
          首先盡量不要在 Controller 里面定義變量,如果不得不。那么
          如果是通用的變量計(jì)算邏輯,使用 synchronized 等同步機(jī)制,如果是各自的計(jì)算邏輯直接放在 ThreadLocal 里面,保持線程獨(dú)有的變量,這樣既不影響性能,也保持?jǐn)?shù)據(jù)準(zhǔn)確。
          往期熱門文章:

          1、我用Java幾分鐘處理完30億個(gè)數(shù)據(jù)...
          2、炸了!Java多線程批量操作,居然有人不做事務(wù)控制
          3、巨坑,常見的 update 語(yǔ)句很容易造成Bug
          4、完爆90%的數(shù)據(jù)庫(kù)性能毛病!
          5、Spring Boot性能太差,教你幾招輕松搞定
          6、Fastjson 2 來了,性能繼續(xù)提升,還能再戰(zhàn)十年
          7、笑死!程序員延壽指南開源了
          8、用 Dubbo 傳輸文件?被老板一頓揍!
          9、45 個(gè) Git 經(jīng)典操作場(chǎng)景,專治不會(huì)合代碼!
          10、@Transactional 注解失效的3種原因及解決辦法

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  91蜜桃传媒在线观看 | 欧美性爱在线观看 | 欧美成人Aⅴ | 99久久精品免费看国产四区 | 四虎AV极速 |