servlet到底是單例還是多例我們說了都不算,要看官方說明。
結論:
先看servlet 2.3規範:
可以看出當servlet實現類實現了singlethreadmodel接⼝後,他就是屬於執行緒安全的,即多例的(對於乙個服務讓singlethreadmodel介面實現,servlet容器可以例項化多個例項來處理沉重的請求負載並序列化請求特定例項)。
可以先看看這個介面:
說的也很清楚,這個介面在servlet 2.4之後已經是@deprecated了。也就是說在servlet2.4以後是⽆ٞ法保證的。所以還是要確保容
器的情況。不能一概而論。目前來看tomcat8.5還保留了這個實現,在servlet 4.0規範中這個也還保留著:
之所以要淘汰掉singlethreadmodel,是因為它相當於把鎖加到了service方法上,同步的範圍太大了,所以後續規範希望使用者自行控制,並且告訴servlet物件預設不是執行緒安全的。
但是是不是這樣就可以認為在servlet 2.4以後,servlet的例項就都是多例的,必須要考慮執行緒安全的問題?也不能這麼說,servlet是單例或者多例,是要看servlet宣告的情況,比如:
上圖看出:同樣的類,申明兩次。就是兩個例項。那麼就是多例。 不過servlet web應⽤不允許同名。
這兩個servelt⼜可以對映到不同的url-pattern上去。所以證明了既可以是單例,也可以是多例。這樣會不會認為單例才會有執行緒安全,多例完全是執行緒不安全的?
但是也不能這麼說,執行緒安全的問題與servlet的例項是單例還是多例沒有關係。主要關鍵還是體現在實現類的⽅ٛ法。比如,⼀個servlet context即servlet應⽤底層有⼀個map,key就是servlet的名稱,value則是servlet的例項。假設上圖中的echoservlet類實現了singlethreadmodel接⼝,那麼它很可能兩個例項都是執行緒安全的。這⾥很有可能,但也是不確定的,具體的還是要親⾃去實現⼀下。所以到底是單例還是多例,是執行緒安全還是不安全,不能一概而論。
單例和多例
單例模式 兩種寫法 一.懶漢式 最簡單的寫法 怕多執行緒 中間的寫法 無法實現多執行緒 雙鎖的寫法 實現了執行緒安全,並保留了多執行緒。特點 1 單例類只能有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。public class user private ...
spring 單例與多例
id student class com.ly.entity.student init method init destroy method destroy scope singleton bean scope prototype 為多例 預設單例模式 singleton 單例模式 框架啟動時,就例...
JavaSE 單例和多例
一 單例設計模式 定義 乙個類只能允許例項化乙個物件 餓漢式單例 public class test public static test getinstance public void print 特點 立即初始化 餓漢式單例 立即載入,執行緒安全,記憶體可能會浪費 懶漢式單例 public cl...