java servlet是单例吗_关于java:为什么apache servlet是单例?
本問題已經(jīng)有最佳答案,請猛點這里訪問。
HttpServletRequest request;
HttpServletResponse response;
public void doGet(HttpServletRequest request , HttpServlet response){
this.request = request;
this.response = response;
}
如果此servlet一次收到多個請求會發(fā)生什么?
我們遇到了響應(yīng)不匹配的問題。 這是一個問題嗎?
不要這樣做。 真。 別。
這使得世界陷入了黑洞
了解servlet的工作原理:stackoverflow.com/questions/3106452/
您的Web應(yīng)用程序容器僅加載一個servlet實例。
要編寫線程安全的servlet,你幾乎不應(yīng)該使用實例變量。將請求和響應(yīng)設(shè)置為實例變量是完全錯誤的。 servlet的實例不屬于單個請求。
如果您需要將請求或響應(yīng)的元素提供給其他方法,請將它們傳遞給這些方法。您不需要它們作為實例變量。
嘗試編寫一個沒有實例變量的非平凡servlet; servlet必須在某些時候(即服務(wù))將控制權(quán)委托給某事物。你的意思是不使用非線程安全的實例變量。
當(dāng)然這是一個問題。 servlet是一個單例。相同的servlet實例用于處理對此servlet的所有請求。并且請求當(dāng)然是同時處理的。這意味著如果你這樣做,thread1將使用通常由thread2處理的請求和響應(yīng)。
根據(jù)定義,Servlet不是單身人士。 Servlet API不會將特定Servlet類的創(chuàng)建限制為單個實例。 Container通常會為部署描述符中的每個servlet聲明創(chuàng)建一個servlet實例。單例是一種設(shè)計模式,它將其類的對象的創(chuàng)建限制為1且僅為1。
它們不是GoF模式意義上的單例,但它們是有效的,因為servlet規(guī)范要求容器只為每個servlet聲明實例化一個實例。單例不僅僅是GoF設(shè)計模式。你曾經(jīng)使用像Spring或Guice這樣的依賴注入框架嗎?在這種情況下從未見過單身人士?
是的,我有。我試圖與GoFs對單身人士的定義聯(lián)系起來。并加上1為您的詳細(xì)說明:)
所以你選擇了一個特定的singleton定義,并決定servlet沒有遵循這個特定的定義,因此不是單身人士?這就像說免費啤酒不是免費的,因為它甚至沒有開源許可證。
引用Servlet規(guī)范
"每個請求和響應(yīng)對象僅在servlet的服務(wù)方法范圍內(nèi)有效,或者在過濾器的doFilter方法范圍內(nèi)有效。容器通常是回收的
請求對象以避免請求對象的性能開銷
創(chuàng)建。開發(fā)人員必須意識到維護(hù)對請求對象的引用
不建議在上述范圍之外,因為它可能具有不確定性
結(jié)果。"
這與OPs問題沒有太大關(guān)系。如果他在doGet()末尾使實例變量無效,則請求和響應(yīng)對象的范圍不會擴(kuò)展到服務(wù)方法之外,但他仍然會遇到很大問題。
似是而非。但仍然。如果規(guī)范保證保存對這些對象的引用的不確定結(jié)果,為什么要這樣做呢?
它并不保證任何類型。您可以根據(jù)需要保存任意數(shù)量的引用,只要您不在服務(wù)方法范圍之外使用這些引用即可。您只需要以線程安全的方式執(zhí)行此操作。例如,許多框架在ThreadLocal變量中存儲對請求的引用。
我學(xué)會了,謝謝。實際上,這變成了一個爭論,我不想進(jìn)入。我批評你和我的。感謝您的所有澄清。
我沒那樣接受它。我只想捍衛(wèi)自己的觀點,就是這樣。
發(fā)生的事情是,您的servlet立即變?yōu)椴豢芍厝?#xff0c;并且在第一次由多個客戶端同時調(diào)用時肯定會失敗。你不能這樣做。
這肯定會產(chǎn)生問題,任何實例變量都是共享的,因為servlet是單例,因此將覆蓋并發(fā)請求和響應(yīng)對象。
這是一個問題,永遠(yuǎn)不建議將HttpServletRequest request / HttpServletResponse響應(yīng)聲明為實例變量。實際上Servlet正在實現(xiàn)單線程模型,這意味著只創(chuàng)建了一個servlet實例。每個請求都有一個線程。因此,如果它們有很多請求,則thr必須是多個線程,并且每個線程共享相同的servlet實例,這將導(dǎo)致數(shù)據(jù)不匹配或數(shù)據(jù)不一致問題。線程將在相同的實例上工作。
單線程模型!= singleton servlet。單線程模型正是模型(沒有人使用因為它效率低下),它保證只有一個線程使用給定的servlet。
不建議使用"單線程實現(xiàn)"。它被棄用了。
-1;這個答案沒有提供任何價值。其他人已經(jīng)說過它的部分錯誤。
總結(jié)
以上是生活随笔為你收集整理的java servlet是单例吗_关于java:为什么apache servlet是单例?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: avro和java原生序列化的区别,ja
- 下一篇: java1002java,疯狂java学
