實現servlet的單執行緒的jsp命令是:
<%@ page isthreadsafe=」false」%>
<%@ page isthreadsafe="true|false" %>
預設值為true
isthreadsafe=false模式表示它是以singleton模式執行。
該模式implements了介面singlethreadmode,
該模式同一時刻只有乙個例項,不會出現資訊同步與否的概念。
若多個使用者同時訪問乙個這種模式的頁面,
那麼先訪問者完全執行完該頁面後,後訪問者才開始執行。
isthreadsafe=true模式表示它以多執行緒方式執行。
該模式的資訊同步,需訪問同步方法(用synchronized標記的)來實現。
一般格式如下:
public synchronized void syncmethod(...)
this.notifyall();
} 那我們看看他編譯後的servlet類和以前的servlet有什麼不同?沒有加入這條指令的頁面中servlet類定義是:
而加入這個命令之後的類定義是:
singlethreadmodel介面的。有興趣的朋友可以查下相關資料,其實這個介面在servlet2.4之後就廢除了。那麼為什麼廢除?實現了這個介面檢視**內容的時候卻發現什麼方法都沒新增,為什麼?
其實這個介面只是乙個標識,讓容器改變servlet生成策略的。
預設的,servlet容器是只建立servlet単例項,為請求提供執行緒池,我們為了能保證servlet的執行緒安全問題而不在servlet中新增例項屬性。
但是如果乙個servlet實現了singlethreadmodel介面那容器在建立例項池,為每個求情分配例項,當使用者請求結束時將例項歸還例項池。
這樣做真的安全嗎?非也!因為每個請求都會分發乙個servlet例項,對於同使用者下分發的不同的servlet來說很可能用到同乙個session中的屬性資料,這樣當然出現了執行緒同步的問題,是不安全的!而且不同使用者也可能享用同乙個context中的資料,也是不安全的。於是在servlet2.4中建議不再使用這樣的設定。
這樣一來我們知道:如果非要實現servlet單執行緒那就要在servlet中實現singlethreadmodel介面,在jsp中新增<@ page isthreadsafe="false">命令。但是這是不被提倡的。
也有網友疑問:讓servlet單執行緒而多例項本來不是為了執行緒安全的嗎?為什麼<@ page isthreadsafe=?>?的答案卻是false?
我覺得這是個誤區,這樣設定真的是單執行緒嗎?那肯定不是了,其實這個設定只是要容器保證同一時刻只有乙個執行緒能在servlet的service方法中執行,因為預設的容器例項化servlet時時単例項,如果同時只有乙個執行緒去管理這個唯一的servlet例項,那效能將是極其慢的,為了解決這個問題,容器採取了servlet例項池的方式。每個請求乙個執行緒,而乙個執行緒乙個servlet。
因為這種方式並不是執行緒安全的,所以答案是false。
終上所述:其實這道題目是指如果讓乙個servlet例項對應乙個執行緒,而不是乙個servlet例項對應多個執行緒的預設方式。
servlet的單執行緒模式
實現servlet的單執行緒的jsp命令是 page isthreadsafe false page isthreadsafe true false color red 預設值為true color color blue isthreadsafe false模式表示它是以singleton模式執行。...
如何實現servlet得單執行緒模式
這個面試題挺經典的,可是網上很多朋友的回答題不達意,所以我在這裡就這個問題做一下 網上朋友的回答是加入 page isthreadsafe false 這條命令。天啊,我暈!這是什麼命令?是jsp的命令啊,怎麼會加入到servlet中呢?當然了,jsp的執行實質是servlet機制,這條命令是jsp...
php 單執行緒
php 從設計之初到流行起來都沒有出現明顯需要用多執行緒才能解決的需求。某些需要用到多執行緒的地方也有相應的解決方案和替代方案。多執行緒並不總是比單執行緒優,多執行緒可能會引入其他問題 例如 兩個執行緒同時呼叫乙個類裡的同乙個方法時,可能出現死鎖的情況 每個 php 檔案的執行是單執行緒的,但是,伺...