日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring的controller是单例模式,但是是多线程,各个线程之间不影响

發(fā)布時間:2023/12/31 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring的controller是单例模式,但是是多线程,各个线程之间不影响 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

spring mvc 的Controller類默認(rèn)Scope是單例(singleton)的

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

?

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

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

1. 如果是單例類型類的,那么在Controller類中的類變量應(yīng)該是共享的,如果不共享,就說明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;

  • @Controller

  • public class ExampleAction {

  • private int singletonInt=0;

  • @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

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

    第一次: singletonInt=15

    第二次: singletonInt=30

    第三次: singletonInt=45

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

    2. 如果Controller類是單例,那么多個線程請求同一個Controller類中的同一個方法,線程是否會堵塞

    ?

    ?
  • @RequestMapping(value = "/sleepdata")

  • @ResponseBody

  • public String switcher(HttpServletRequest request

  • , HttpServletResponse response)

  • throws Exception {

  • String sleep = request.getParameter("sleep");

  • if (sleep.equals("on")) {

  • Thread.currentThread().sleep(100000);

  • return "sleep on";

  • } else {

  • return sleep;

  • }

  • }

  • ?

    驗證方法:分別發(fā)送兩個請求,

    第一個請求:http://localhost:8080/coreplat/sleepdata.do?sleep=on

    第二個請求:http://localhost:8080/coreplat/sleepdata.do?sleep=test

    驗證結(jié)果:第一個請求發(fā)出去以后,本地服務(wù)器等待100s,然后返回結(jié)果”sleep on”,在本地服務(wù)器等待的者100s當(dāng)中,發(fā)送第二個請求,直接返回結(jié)果”test”。說明之間的線程是不互相影響的。

    轉(zhuǎn)載于:https://my.oschina.net/wangen2009/blog/2251217

    總結(jié)

    以上是生活随笔為你收集整理的spring的controller是单例模式,但是是多线程,各个线程之间不影响的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。