鍍金池/ 問答/Java  HTML/ 關(guān)于spring容器的一些疑問

關(guān)于spring容器的一些疑問

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

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

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

問題的本質(zhì)spring沒啥關(guān)系,java里面類的方法,如果沒有同步或鎖的機(jī)制,是可以并發(fā)調(diào)用的,這一點(diǎn)可以自己寫個(gè)多線程的程序驗(yàn)證。

2017年5月5日 23:09
編輯回答
護(hù)她命

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

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

要驗(yàn)證你的疑問很簡(jiǎn)單,

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

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

2018年7月8日 07:13