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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java servlet是单例吗_关于java:为什么apache servlet是单例?

發布時間:2025/3/12 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java servlet是单例吗_关于java:为什么apache servlet是单例? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本問題已經有最佳答案,請猛點這里訪問。

HttpServletRequest request;

HttpServletResponse response;

public void doGet(HttpServletRequest request , HttpServlet response){

this.request = request;

this.response = response;

}

如果此servlet一次收到多個請求會發生什么?

我們遇到了響應不匹配的問題。 這是一個問題嗎?

不要這樣做。 真。 別。

這使得世界陷入了黑洞

了解servlet的工作原理:stackoverflow.com/questions/3106452/

您的Web應用程序容器僅加載一個servlet實例。

要編寫線程安全的servlet,你幾乎不應該使用實例變量。將請求和響應設置為實例變量是完全錯誤的。 servlet的實例不屬于單個請求。

如果您需要將請求或響應的元素提供給其他方法,請將它們傳遞給這些方法。您不需要它們作為實例變量。

嘗試編寫一個沒有實例變量的非平凡servlet; servlet必須在某些時候(即服務)將控制權委托給某事物。你的意思是不使用非線程安全的實例變量。

當然這是一個問題。 servlet是一個單例。相同的servlet實例用于處理對此servlet的所有請求。并且請求當然是同時處理的。這意味著如果你這樣做,thread1將使用通常由thread2處理的請求和響應。

根據定義,Servlet不是單身人士。 Servlet API不會將特定Servlet類的創建限制為單個實例。 Container通常會為部署描述符中的每個servlet聲明創建一個servlet實例。單例是一種設計模式,它將其類的對象的創建限制為1且僅為1。

它們不是GoF模式意義上的單例,但它們是有效的,因為servlet規范要求容器只為每個servlet聲明實例化一個實例。單例不僅僅是GoF設計模式。你曾經使用像Spring或Guice這樣的依賴注入框架嗎?在這種情況下從未見過單身人士?

是的,我有。我試圖與GoFs對單身人士的定義聯系起來。并加上1為您的詳細說明:)

所以你選擇了一個特定的singleton定義,并決定servlet沒有遵循這個特定的定義,因此不是單身人士?這就像說免費啤酒不是免費的,因為它甚至沒有開源許可證。

引用Servlet規范

"每個請求和響應對象僅在servlet的服務方法范圍內有效,或者在過濾器的doFilter方法范圍內有效。容器通常是回收的

請求對象以避免請求對象的性能開銷

創建。開發人員必須意識到維護對請求對象的引用

不建議在上述范圍之外,因為它可能具有不確定性

結果。"

這與OPs問題沒有太大關系。如果他在doGet()末尾使實例變量無效,則請求和響應對象的范圍不會擴展到服務方法之外,但他仍然會遇到很大問題。

似是而非。但仍然。如果規范保證保存對這些對象的引用的不確定結果,為什么要這樣做呢?

它并不保證任何類型。您可以根據需要保存任意數量的引用,只要您不在服務方法范圍之外使用這些引用即可。您只需要以線程安全的方式執行此操作。例如,許多框架在ThreadLocal變量中存儲對請求的引用。

我學會了,謝謝。實際上,這變成了一個爭論,我不想進入。我批評你和我的。感謝您的所有澄清。

我沒那樣接受它。我只想捍衛自己的觀點,就是這樣。

發生的事情是,您的servlet立即變為不可重入,并且在第一次由多個客戶端同時調用時肯定會失敗。你不能這樣做。

這肯定會產生問題,任何實例變量都是共享的,因為servlet是單例,因此將覆蓋并發請求和響應對象。

這是一個問題,永遠不建議將HttpServletRequest request / HttpServletResponse響應聲明為實例變量。實際上Servlet正在實現單線程模型,這意味著只創建了一個servlet實例。每個請求都有一個線程。因此,如果它們有很多請求,則thr必須是多個線程,并且每個線程共享相同的servlet實例,這將導致數據不匹配或數據不一致問題。線程將在相同的實例上工作。

單線程模型!= singleton servlet。單線程模型正是模型(沒有人使用因為它效率低下),它保證只有一個線程使用給定的servlet。

不建議使用"單線程實現"。它被棄用了。

-1;這個答案沒有提供任何價值。其他人已經說過它的部分錯誤。

總結

以上是生活随笔為你收集整理的java servlet是单例吗_关于java:为什么apache servlet是单例?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。