新聞中心
Servlet體系結(jié)構(gòu)是建立在Java多線程機(jī)制之上的,它的生命周期是由Web容器負(fù)責(zé)的。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了合水免費(fèi)建站歡迎大家使用!
當(dāng)客戶端第一次請求某個Servlet時(shí),Servlet容器將會根據(jù)web.xml配置文件實(shí)例化這個Servlet類。當(dāng)有新的客戶端請求該Servlet時(shí),一般不會再實(shí)例化該Servlet類,也就是有多個線程在使用這個實(shí)例。
這樣的話,當(dāng)兩個或多個線程同時(shí)訪問同一個Servlet時(shí),可能會發(fā)生多個線程同時(shí)訪問同一資源的情況,數(shù)據(jù)可能會變得不一致,所以就很容易造成一系列的一些安全性問題。
解決此類的方法也有多
1、實(shí)現(xiàn) SingleThreadModel 接口
該接口指定了系統(tǒng)如何處理對同一個Servlet的調(diào)用。如果一個Servlet被這個接口指定,那么在這個Servlet中的service方法將不會有兩個線程被同時(shí)執(zhí)行,當(dāng)然也就不存在線程安全的問題。這種方法只要繼承這個接口就行了
- public class XXXXX extends HttpServlet implements SingleThreadModel {
- …………
- }
2、同步對共享數(shù)據(jù)的操作
使用synchronized 關(guān)鍵字能保證一次只有一個線程可以訪問被保護(hù)的區(qū)段,在本論文中可以通過同步塊操作來保證Servlet的線程安全。同步后的代碼如下:
- Public class XXXXXX extends HttpServlet {
- …………
- synchronized (this){XXXX}
- }
3、避免使用實(shí)例變量
線程安全問題還有些是由實(shí)例變量造成的,只要在Servlet里面的任何方法里面都不使用實(shí)例變量,那么該Servlet就是線程安全的。
對上面的三種方法進(jìn)行測試,可以表明用它們都能設(shè)計(jì)出線程安全的Servlet程序。但是,如果一個Servlet實(shí)現(xiàn)了SingleThreadModel接口,Servlet引擎將為每個新的請求創(chuàng)建一個單獨(dú)的Servlet實(shí)例,這將引起大量的系統(tǒng)開銷。SingleThreadModel在Servlet2.4中已不再提倡使用;同樣如果在程序中使用同步來保護(hù)要使用的共享的數(shù)據(jù),也會使系統(tǒng)的性能大大下降。這是因?yàn)楸煌降拇a塊在同一時(shí)刻只能有一個線程執(zhí)行它,使得其同時(shí)處理客戶請求的吞吐量降低,而且很多客戶處于阻塞狀態(tài)。另外為保證主存內(nèi)容和線程的工作內(nèi)存中的數(shù)據(jù)的一致性,要頻繁地刷新緩存,這也會大大地影響系統(tǒng)的性能。所以在實(shí)際的開發(fā)中也應(yīng)避免或最小化Servlet 中的同步代碼;在Serlet中避免使用實(shí)例變量是保證Servlet線程安全的最佳選擇。從Java 內(nèi)存模型也可以知道,方法中的臨時(shí)變量是在棧上分配空間,而且每個線程都有自己私有的棧空間,所以它們不會影響線程的安全。
小結(jié)
Servlet的線程安全問題只有在大量的并發(fā)訪問時(shí)才會顯現(xiàn)出來,并且很難發(fā)現(xiàn),因此在編寫Servlet程序時(shí)要特別注意。線程安全問題主要是由實(shí)例變量造成的,因此在Servlet中應(yīng)避免使用實(shí)例變量。如果應(yīng)用程序設(shè)計(jì)無法避免使用實(shí)例變量,那么使用同步來保護(hù)要使用的實(shí)例變量,但為保證系統(tǒng)的最佳性能,應(yīng)該同步可用性最小的代碼路徑。
名稱欄目:Servlet線程安全的解決方法
地址分享:http://fisionsoft.com.cn/article/dhjsgcs.html


咨詢
建站咨詢
