Servlet总结04——注意Servlet单实例的线程安全性
生活随笔
收集整理的這篇文章主要介紹了
Servlet总结04——注意Servlet单实例的线程安全性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Servlet容器采用了單實例多線程的方式(Servlet容器默認的設置),這樣可以減少創建實例的開銷,提高效率。
但是在多線程方面也埋下了不少隱患,需要開發者格外小心。
(一)變量的安全性
錯誤實例:
public class test extends HttpServlet{String user = "" ;public void doGet(HttpServletRequest req , HttpServletResponse res) throws ServletException , IOException{user = req.getParameter("user");......}}例如:a、b同時訪問這個servlet,a提交的user=aaa,b提交的user=bbb。
首先,servlet容器分配一個線程T-a來處理請求a,獲取其user的值aaa,并賦給變量user。此時T-a時間片到了,servlet容器分配另外一個線程T-b來處理請求b,
獲取其user的值bbb,并覆蓋變量user,當T-a線程重新獲取執行權時,user已經“物是人非”了。
這里可以類比:jdbc的事務管理,“丟失更新”和這個場景類似。
?
解決方案:
1)定義本地變量,將user在doGet方法中定義。
因為user是本地變量,每一個線程都有user變量的拷貝,彼此不受影響。
?
2)設置方法同步(或者同步塊)
因為設置了同步,可以防止多個線程同時調用doGet方法。但是所有請求該servlet的“請求”將串行處理,影響效率。
總結
以上是生活随笔為你收集整理的Servlet总结04——注意Servlet单实例的线程安全性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: object-c 队列
- 下一篇: servlet和webservice+W