在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  HTML/ 關于spring容器的一些疑問

關于spring容器的一些疑問

spring的bean底層應該是基于servlet,那么肯定是單例多線程。

  • 一個@controller是一個bean的話,如果兩個瀏覽器(A,B)幾乎同時訪問“/login”。那么是不是要等A發(fā)送的請求在@requestmapping(“/login”)中處理完成,才會讓B請求進入該方法,在A處理完成之前,訪問“/login”的請求都處于阻塞狀態(tài)?
  • 當“/login”和“/register”存在與同一個@controller時,完成A請求的”/login“后,B請求的”/register“才會得到處理?同理,在兩個controller中同時訪問一個@autowired的service中的不同的方法,是否也是在第一個處理完畢之前,第二個為阻塞狀態(tài)?
  • 一個@controller表示一個bean,每個bean都是單例。那么是不是一個bean中封裝的方法越少越好,控制到最小的線程安全的顆粒度?
  • 如果不是一個@controller就能同時進行?比如說一邊在controller1處理A的"/login"請求,一邊在controller2處理B的"/index"請求
回答
編輯回答
萢萢糖

如果所有的請求都是串行執(zhí)行的,那么服務器怎么處理多用戶的請求?如果有一個請求執(zhí)行了10秒,其他請求都在排隊,這系統(tǒng)還能用嗎?

問題的本質spring沒啥關系,java里面類的方法,如果沒有同步或鎖的機制,是可以并發(fā)調用的,這一點可以自己寫個多線程的程序驗證。

2017年5月5日 23:09
編輯回答
護她命

第一句話已經說明一切了,就是單例多線程,當一個瀏覽器使用這個單例的時候,另一個瀏覽器可以同時以多線程的方式使用這個單例,除非代碼里自己加鎖。

2017年6月21日 23:03
編輯回答
若相惜

要驗證你的疑問很簡單,

    @RequestMapping("/index")
    String test() {
        String name = Thread.currentThread().getName();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return name;
    }

將當前線程的名稱展示在瀏覽器上面,然后你開兩個瀏覽器同時刷,你會發(fā)現(xiàn)線程的名稱不一樣。
第1點:spring有并發(fā)處理請求的能力,你說的是序列化的情形
第2點:除非bean中存在共享變量,并且需要進行線程安全同步,那么這點實際上無須擔心。
第3點:一個controller也能同時運行

2018年7月8日 07:13