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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

使用springboot單例模式與線(xiàn)程安全問(wèn)題踩的坑

瀏覽:205日期:2023-02-19 16:52:57
springboot單例模式與線(xiàn)程安全問(wèn)題踩的坑

最近有客戶(hù)反映,使用公司產(chǎn)品時(shí),偶爾會(huì)存在崩潰情況,自己測(cè)試無(wú)問(wèn)題,然后去查日志,是報(bào)空指針。

于是順藤摸瓜 往上找,好嘛,之前的開(kāi)發(fā)使用了成員變量,感覺(jué)問(wèn)題就是在這里了,因?yàn)楸娝苤瑂pringboot 采用的是單例模式,所以,使用成員變量時(shí)一定要謹(jǐn)慎。

下面上一張?jiān)擃?lèi)的截圖:

使用springboot單例模式與線(xiàn)程安全問(wèn)題踩的坑

大家可能看到了,該類(lèi)上面加上了@Scope('prototype') 注解,該注解的作用是將該類(lèi)變成多例模式。講道理因?yàn)樽優(yōu)榱硕嗬瑧?yīng)該不會(huì)有線(xiàn)程問(wèn)題了。

我先說(shuō)下我這邊的一個(gè)代碼環(huán)境,上面大家看到的BaseController這個(gè)類(lèi)里面有個(gè)init方法,會(huì)在繼承它的類(lèi)的所有方法前執(zhí)行。

使用springboot單例模式與線(xiàn)程安全問(wèn)題踩的坑

使用的是@ModelAttribute注解,這個(gè)注解的意思是,在該controller的所有方法前執(zhí)行,意在初始化,我猜測(cè)之前的同事應(yīng)該是為了獲取相同的一些參數(shù),抽調(diào)出來(lái)做一個(gè)父類(lèi),隨著迭代,別的同事為了方便,拿來(lái)就用,導(dǎo)致很多controller繼承了該類(lèi)。

@Scope('prototype')注解:

大家設(shè)想一下,若父類(lèi)加了@Scope('prototype')注解,子類(lèi)controller并沒(méi)有加該注解,會(huì)怎樣呢?該注解是否還有意義?再比如,我在某service上加上@Scope('prototype')注解,但調(diào)用的controller沒(méi)有加@Scope('prototype')注解,那么會(huì)出現(xiàn)什么樣的結(jié)果呢?大家可以去測(cè)試一下,測(cè)試方法也很簡(jiǎn)單,就是在對(duì)應(yīng)的父類(lèi)或service的無(wú)參構(gòu)造方法里打印該類(lèi)的地址。

下面說(shuō)下我的測(cè)試結(jié)果:

先說(shuō)父類(lèi)上加了@Scope('prototype')注解,子類(lèi)上沒(méi)有加這種情況。結(jié)果是,同一子類(lèi)繼承的為同一父類(lèi),不同子類(lèi)繼承為不同父類(lèi)。理解一下,很簡(jiǎn)單,因?yàn)閟pringboot為單例模式,所以子類(lèi)為單例,那么只有一個(gè)子類(lèi),父類(lèi)肯定是一樣的。所以,不同線(xiàn)程過(guò)來(lái)使用的為同一變量,就會(huì)有問(wèn)題。

同理:

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

現(xiàn)在說(shuō)下解決方法:

1、是在繼承該controller的子類(lèi)上都加上@Scope('prototype')注解。這樣做的好處是簡(jiǎn)單。壞處也同樣明顯,因?yàn)槭嵌嗬模敲淳蜁?huì)產(chǎn)生大量的實(shí)體類(lèi),占用大量?jī)?nèi)存,若是回收不及時(shí),有可能會(huì)出現(xiàn)內(nèi)存溢出。

2、是將變量私有化,比如使用線(xiàn)程變量,對(duì)變量加鎖等,技術(shù)上會(huì)復(fù)雜一些,而且調(diào)試不太好調(diào)試。說(shuō)不定那些地方就會(huì)出現(xiàn)問(wèn)題,畢竟是老代碼。

3、將該類(lèi)轉(zhuǎn)換為攔截器,將變量放入request里,用的時(shí)候取出來(lái)。

SpringMVC 或 SpringBoot 默認(rèn)是單例模式(Singleton)多個(gè)請(qǐng)求是訪(fǎng)問(wèn)的同一個(gè)方法,是如何實(shí)現(xiàn)線(xiàn)程安全的?

SpringMVC Controller默認(rèn)情況下是Singleton(單例)的,當(dāng)request過(guò)來(lái),不用每次創(chuàng)建Controller,會(huì)用原來(lái)的instance去處理。那么當(dāng)多個(gè)線(xiàn)程調(diào)用它的時(shí)候,會(huì)不會(huì)發(fā)生線(xiàn)程不安全呢?

1、先說(shuō)明下 Controller默認(rèn)情況 單例的問(wèn)題:

使用Spring MVC有一段時(shí)間了,之前一直使用Struts2,在struts2中action都是原型(prototype)的, 說(shuō)是因?yàn)榫€(xiàn)程安全問(wèn)題,對(duì)于Spring MVC中bean默認(rèn)都是(singleton)單例的,那么用@Controller注解標(biāo)簽注入的Controller類(lèi)是單例實(shí)現(xiàn)的?

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

以下是測(cè)試步驟,代碼與結(jié)果.

1. 如果是單例類(lèi)型類(lèi)的,那么在Controller類(lèi)中的類(lèi)變量應(yīng)該是共享的,如果不共享,就說(shuō)明Controller類(lèi)不是單例。

以下是測(cè)試代碼:

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); }}

分別三次請(qǐng)求: http://localhost:8080/example/test.do?data=15

得到的返回結(jié)果如下。

第一次: singletonInt=15

第二次: singletonInt=30

第三次: singletonInt=45

從以上結(jié)果可以得知,singletonInt的狀態(tài)是共享的,因此Controller是單例的。

2、對(duì)別Struts與springmvc對(duì)比

Struts2:默認(rèn)prototype,Struts2 是基于類(lèi)的,處于線(xiàn)程安全的考慮,采用了prototype模式,也就是說(shuō)每次請(qǐng)求都會(huì)新建一個(gè)類(lèi)來(lái)處理,自然就沒(méi)有線(xiàn)程安全問(wèn)題了,每次請(qǐng)求的類(lèi)和數(shù)據(jù)都是單獨(dú)的。

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

在類(lèi)中沒(méi)有成員變量的前提下則是線(xiàn)程安全的。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品88久久久久久| 久久视频一区| 久久精品高清| 日韩天堂在线| 九九综合九九| 久热re这里精品视频在线6| 亚洲精品高潮| 久久狠狠久久| 国产欧美日韩在线观看视频| 精品免费av一区二区三区| 91看片一区| 亚洲精品人人| 欧美xxxx中国| 蜜桃伊人久久| 久久在线91| 宅男噜噜噜66国产日韩在线观看| 亚洲精品少妇| 欧美xxxx中国| 中文字幕免费一区二区| 国产精品欧美在线观看| 中文字幕在线高清| 香蕉成人久久| 麻豆极品一区二区三区| 你懂的国产精品永久在线| 在线一区视频| 影院欧美亚洲| 日韩精品一级| 1024精品一区二区三区| 精品美女视频| 91亚洲国产高清| 日韩一区三区| 亚洲美女久久精品| 亚洲成人国产| 欧美成a人片免费观看久久五月天| 伊人国产精品| 久久精品国产一区二区| 成人免费电影网址| 日本不卡视频在线观看| 精品五月天堂| 视频一区国产视频| 91亚洲人成网污www| 亚洲精品美女91| 爽爽淫人综合网网站| 中文精品在线| 国产欧美午夜| 午夜影院欧美| 亚洲综合电影| 国产精品天天看天天狠| 91精品1区| 麻豆精品国产91久久久久久| 中文字幕亚洲影视| 亚洲调教视频在线观看| 国产精品主播| 久久久夜精品| 久久久免费人体| 男人的天堂久久精品| 日韩久久视频| 免费看久久久| 91在线成人| 免费欧美日韩| 正在播放日韩精品| 国产精品美女久久久久久不卡| 夜夜嗨av一区二区三区网站四季av| 成人在线视频区| 91精品国产经典在线观看| 一区二区三区网站| 日韩一区二区久久| 免费av一区二区三区四区| 精品午夜视频| 美女久久99| 国产精品一区二区三区av麻| 一区二区国产精品| 性欧美长视频| 国产精品日本| 国产精品美女久久久| av亚洲在线观看| 成人羞羞在线观看网站| 欧美一级精品| 日产欧产美韩系列久久99| 午夜国产精品视频| 欧美va天堂在线| 日韩精品不卡一区二区| 国产在线观看www| 日本亚洲三级在线| 亚洲精品影院在线观看| 在线精品亚洲| 日韩欧乱色一区二区三区在线| 日韩在线一二三区| 日韩专区欧美专区| 综合五月婷婷| 天堂精品久久久久| 91久久精品无嫩草影院| 欧美精品影院| 国产精品亚洲二区| 国产精品xxx在线观看| 久久gogo国模啪啪裸体| 精品亚洲a∨| 日韩毛片视频| 久久精品影视| 自由日本语亚洲人高潮| 狠狠久久婷婷| 综合国产精品| 国产美女视频一区二区| 欧美黑人巨大videos精品| 日韩1区在线| 久久中文字幕二区| 91精品福利| 中文字幕一区二区三区日韩精品 | 国产不卡av一区二区| 水蜜桃久久夜色精品一区| 久久久久久黄| 国产亚洲精品自拍| 欧美日韩亚洲一区在线观看| 久久99精品久久久野外观看| 国产精品99视频| 免费观看久久av| 在线观看亚洲精品福利片| 欧美午夜三级| 国产va在线视频| 亚洲激情国产| 日韩欧美三区| 国产中文欧美日韩在线| 成人av三级| 免费精品视频| 国产福利一区二区精品秒拍 | 久久av在线| 国产精品久久久久久久久久白浆 | 丰满少妇一区| 国产精品88久久久久久| 日本成人在线视频网站| 成人一区不卡| 欧美日韩国产一区精品一区| 国产日韩精品视频一区二区三区| 黄毛片在线观看| 蜜臀精品一区二区三区在线观看| 国产精品久久亚洲不卡| 99热国内精品| 91精品国产一区二区在线观看| 丝袜美腿诱惑一区二区三区 | 欧美一区免费| 亚洲视频综合| 国产精品久久免费视频| 91精品二区| 麻豆精品久久| 久久午夜精品一区二区| 久久99久久人婷婷精品综合| 美女毛片一区二区三区四区| 国产成人精品999在线观看| 男人操女人的视频在线观看欧美| 久久精品伊人| 伊人久久大香伊蕉在人线观看热v| 国产精品99一区二区三| 少妇精品久久久一区二区三区| 桃色av一区二区| 国产亚洲精品美女久久久久久久久久| 啪啪国产精品| 欧美精品不卡| 免费在线看一区| 日韩国产网站| 另类综合日韩欧美亚洲| 日韩亚洲在线| 日韩电影在线视频| 国产精品网在线观看| 免费的成人av| 亚洲手机在线| 日本免费一区二区三区四区| 国产精品网站在线看| 三级亚洲高清视频| 久久国产中文字幕| 国产一区二区色噜噜| 91欧美精品| 亚洲天堂av资源在线观看| 久久精品影视| 日韩高清欧美| 激情中国色综合| 91p九色成人| 亚洲毛片在线免费| 亚洲在线观看| 久久久久.com| 日韩在线精品| 日韩精品1区| 国产精品久久久久久久久久10秀| 国产福利资源一区| 国产精品日韩精品中文字幕| 亚州欧美在线| 亚洲欧美日韩国产综合精品二区 | 国产va在线视频| 国产日产精品_国产精品毛片| 99热免费精品| 国产视频亚洲| 欧美在线资源| 91精品二区| 国产视频一区三区| 亚洲免费在线| 老司机精品久久| 在线观看视频免费一区二区三区| 久久一二三区| 亚洲啊v在线免费视频| 婷婷五月色综合香五月| 亚洲无线观看|