日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

使用springboot單例模式與線程安全問題踩的坑

瀏覽:201日期:2023-02-19 16:52:57
springboot單例模式與線程安全問題踩的坑

最近有客戶反映,使用公司產品時,偶爾會存在崩潰情況,自己測試無問題,然后去查日志,是報空指針。

于是順藤摸瓜 往上找,好嘛,之前的開發使用了成員變量,感覺問題就是在這里了,因為眾所周知,springboot 采用的是單例模式,所以,使用成員變量時一定要謹慎。

下面上一張該類的截圖:

使用springboot單例模式與線程安全問題踩的坑

大家可能看到了,該類上面加上了@Scope('prototype') 注解,該注解的作用是將該類變成多例模式。講道理因為變為了多例,應該不會有線程問題了。

我先說下我這邊的一個代碼環境,上面大家看到的BaseController這個類里面有個init方法,會在繼承它的類的所有方法前執行。

使用springboot單例模式與線程安全問題踩的坑

使用的是@ModelAttribute注解,這個注解的意思是,在該controller的所有方法前執行,意在初始化,我猜測之前的同事應該是為了獲取相同的一些參數,抽調出來做一個父類,隨著迭代,別的同事為了方便,拿來就用,導致很多controller繼承了該類。

@Scope('prototype')注解:

大家設想一下,若父類加了@Scope('prototype')注解,子類controller并沒有加該注解,會怎樣呢?該注解是否還有意義?再比如,我在某service上加上@Scope('prototype')注解,但調用的controller沒有加@Scope('prototype')注解,那么會出現什么樣的結果呢?大家可以去測試一下,測試方法也很簡單,就是在對應的父類或service的無參構造方法里打印該類的地址。

下面說下我的測試結果:

先說父類上加了@Scope('prototype')注解,子類上沒有加這種情況。結果是,同一子類繼承的為同一父類,不同子類繼承為不同父類。理解一下,很簡單,因為springboot為單例模式,所以子類為單例,那么只有一個子類,父類肯定是一樣的。所以,不同線程過來使用的為同一變量,就會有問題。

同理:

在service上標注@Scope('prototype')注解,那在同一個controller里,該service還是同一個,也就是說還是單例的,在不同的controller里 是不同的。測試方法同上。

現在說下解決方法:

1、是在繼承該controller的子類上都加上@Scope('prototype')注解。這樣做的好處是簡單。壞處也同樣明顯,因為是多例的,那么就會產生大量的實體類,占用大量內存,若是回收不及時,有可能會出現內存溢出。

2、是將變量私有化,比如使用線程變量,對變量加鎖等,技術上會復雜一些,而且調試不太好調試。說不定那些地方就會出現問題,畢竟是老代碼。

3、將該類轉換為攔截器,將變量放入request里,用的時候取出來。

SpringMVC 或 SpringBoot 默認是單例模式(Singleton)多個請求是訪問的同一個方法,是如何實現線程安全的?

SpringMVC Controller默認情況下是Singleton(單例)的,當request過來,不用每次創建Controller,會用原來的instance去處理。那么當多個線程調用它的時候,會不會發生線程不安全呢?

1、先說明下 Controller默認情況 單例的問題:

使用Spring MVC有一段時間了,之前一直使用Struts2,在struts2中action都是原型(prototype)的, 說是因為線程安全問題,對于Spring MVC中bean默認都是(singleton)單例的,那么用@Controller注解標簽注入的Controller類是單例實現的?

測試結果發現spring3中的controller默認是單例的,若是某個controller中有一個私有的變量i,所有請求到同一個controller時,使用的i變量是共用的,即若是某個請求中修改了這個變量a,則,在別的請求中能夠讀到這個修改的內容。 若是在@Controller之前增加@Scope(“prototype”),就可以改變單例模式為多例模式

以下是測試步驟,代碼與結果.

1. 如果是單例類型類的,那么在Controller類中的類變量應該是共享的,如果不共享,就說明Controller類不是單例。

以下是測試代碼:

import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class ExampleAction { private int singletonInt=1; @RequestMapping(value = '/test') @ResponseBody public String singleton(HttpServletRequest request, HttpServletResponse response) throws Exception { String data=request.getParameter('data'); if(data!=null&&data.length()>0){ try{ int paramInt= Integer.parseInt(data); singletonInt = singletonInt + paramInt; } catch(Exception ex){ singletonInt+=10; } }else{ singletonInt+=1000; } return String.valueOf(singletonInt); }}

分別三次請求: http://localhost:8080/example/test.do?data=15

得到的返回結果如下。

第一次: singletonInt=15

第二次: singletonInt=30

第三次: singletonInt=45

從以上結果可以得知,singletonInt的狀態是共享的,因此Controller是單例的。

2、對別Struts與springmvc對比

Struts2:默認prototype,Struts2 是基于類的,處于線程安全的考慮,采用了prototype模式,也就是說每次請求都會新建一個類來處理,自然就沒有線程安全問題了,每次請求的類和數據都是單獨的。

Springmvc:默認singleton 單例模式,Springmvc 是基于方法的,同一個url的請求是同一個實例處理的。每次請求都會把請求參數傳遞到同一個方法中,此時如果類里面有成員變量,那么這個變量就不是線程安全的了(例如上面的例子 private int singletonInt=1; 這個變量如果想線程安全則可以用ThreadLocal)。

在類中沒有成員變量的前提下則是線程安全的。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品人人| 亚洲一区欧美激情| 国产精品一区二区三区四区在线观看| 欧美亚洲国产精品久久| 日韩精品一区第一页| 国产日韩三级| 午夜久久tv| 麻豆成人91精品二区三区| 久久国产精品成人免费观看的软件| 日韩在线二区| 视频一区二区中文字幕| 视频国产精品| 国产精品亚洲欧美一级在线| 亚洲精品一二| 四虎精品一区二区免费| 日韩精品一二三区| 精品久久免费| 亚洲欧美日韩高清在线| 亚洲电影在线一区二区三区| 国产精品传媒麻豆hd| 久久麻豆视频| 久久三级毛片| 久久精品播放| 首页亚洲欧美制服丝腿| 伊人久久大香线蕉av超碰演员| 首页国产欧美久久| 欧美日韩va| 久久电影tv| 一级成人国产| 成人日韩av| 成人羞羞视频播放网站| 久久亚洲二区| 日韩一二三区在线观看| 国产精品白丝av嫩草影院| 国产乱码精品一区二区三区四区 | 少妇精品在线| 蜜臀av免费一区二区三区| 久久久夜精品| 国内揄拍国内精品久久| 欧美日韩视频免费看| 91综合视频| 亚洲一级淫片| 午夜电影一区| 午夜精品久久久久久久久久蜜桃| 国产日韩欧美| 日本视频一区二区| 亚洲欧洲午夜| 欧美精品日日操| 麻豆精品视频在线观看视频| 好吊日精品视频| bbw在线视频| 国产剧情在线观看一区| 午夜久久中文| 91精品xxx在线观看| 亚州av乱码久久精品蜜桃| 中文字幕一区二区三区四区久久 | 国产精品外国| 欧美日韩少妇| 亚洲成人精选| 欧美羞羞视频| 精品一区二区三区中文字幕视频| 欧美中文字幕| 国产欧美综合一区二区三区| 国产日韩欧美中文在线| 亚洲乱码久久| 日韩福利视频导航| 日本精品一区二区三区在线观看视频| 亚洲高清av| 日本免费一区二区三区四区| 在线精品国产亚洲| 91精品国产自产观看在线 | 日韩一区二区三区四区五区| 欧美午夜精彩| 日韩.com| 婷婷五月色综合香五月| 蜜桃av一区二区三区电影| 日韩av午夜在线观看| 久久av网址| 国产农村妇女精品一区二区| 亚洲欧洲高清| 亚洲一区二区免费在线观看| 日韩精品中文字幕吗一区二区| 日本91福利区| 亚洲二区精品| 亚洲免费成人av在线| 亚洲综合在线电影| 美日韩精品视频| 亚洲日本三级| 亚洲美女久久| 天堂va在线高清一区| 欧美日韩精品一本二本三本| 国内精品麻豆美女在线播放视频| 色偷偷色偷偷色偷偷在线视频| 欧美日韩国产免费观看视频| 日本久久一区| 97欧美在线视频| 电影91久久久| 久久中文字幕av| 欧美日韩精品一区二区三区在线观看| 久久黄色影院| 国产精品永久| 亚洲自啪免费| 国产成人久久精品麻豆二区| 爽好多水快深点欧美视频| а√在线中文在线新版| 欧美成人亚洲| 久久国产欧美| 伊伊综合在线| 国产乱子精品一区二区在线观看| 国产精品美女午夜爽爽| 图片区亚洲欧美小说区| 日韩在线观看一区| 国产精品theporn| 日韩av字幕| 日韩电影免费网站| 日韩av首页| 日韩伦理一区| 精品国产亚洲日本| 国产成人免费精品| 精品视频在线你懂得| 欧美亚洲专区| 成人在线视频免费| 免费一级欧美在线观看视频| 伊人久久高清| 亚洲欧美久久精品| 国产日韩欧美一区二区三区在线观看| 先锋亚洲精品| 日韩精品一级中文字幕精品视频免费观看 | 亚洲狼人精品一区二区三区| 精品成人免费一区二区在线播放| 日韩一区电影| 香蕉久久99| 日韩在线看片| 国产一区二区三区亚洲| 久久99蜜桃| 久久国产乱子精品免费女| 精品国产a一区二区三区v免费| 婷婷成人综合| 狠狠干综合网| 日韩中文字幕不卡| 国产欧美日韩一级| 久久久久久夜| 日韩精品一区二区三区免费观影| 欧美www视频在线观看| 裤袜国产欧美精品一区| 97精品国产99久久久久久免费| 成人免费网站www网站高清| 久久精品国产www456c0m| 亚洲少妇在线| 在线亚洲精品| 国产精品久久久久久妇女| 久久超级碰碰| 久久女人天堂| 性欧美长视频| 久久国产成人午夜av影院宅| 欧美伊人久久| 国产99精品| 国产精品视频一区二区三区四蜜臂| 免费精品一区| 国产精品高清一区二区| 国产亚洲人成a在线v网站| 免费美女久久99| 久久在线视频免费观看| 日本美女一区| 91成人网在线观看| 在线亚洲欧美| 日韩中文欧美在线| 日韩精品视频网站| 国产精品亚洲产品| 日产精品一区二区| 91精品一区国产高清在线gif| 欧美亚洲激情| 久久99蜜桃| 91精品在线观看国产| 日韩精品一级二级| 国产精品天天看天天狠| 中文字幕在线高清| 免播放器亚洲| 亚州av日韩av| 午夜亚洲福利| 九九久久国产| 99成人超碰| 你懂的亚洲视频| 午夜av成人| 捆绑调教美女网站视频一区| 国产精品亚洲综合在线观看| 日韩三区四区| 国产精品网站在线看| 午夜久久av| 日韩三级久久| 国产精品高潮呻吟久久久久| 成人羞羞在线观看网站| 国产精品s色| 国语精品一区| 日韩手机在线| 国产亚洲观看| 精品国产精品国产偷麻豆| 999久久久91| 免费在线成人网| 深夜福利视频一区二区|