java struts2進修筆記之線程平安。本站提示廣大學習愛好者:(java struts2進修筆記之線程平安)文章只能為提供參考,不一定能成為您想要的結果。以下是java struts2進修筆記之線程平安正文
在說struts2的線程平安之前,先說一下,甚麼是線程平安?這是一個網友講的。
假如你的代碼地點的過程中有多個線程在同時運轉,而這些線程能夠會同時運轉這段代碼。假如每次運轉成果和單線程運轉的成果是一樣的,並且其他的變量的值也和預期的是一樣的,就是線程平安的。
就是說,在一個過程中有多個線程並發履行,每一個線程履行進程中,變量值是雷同的,履行成果也是雷同的,就是線程平安的.不然就是線程不平安的.
然後回想一下servlet的線程平安成績,因為servlet是單例形式的,只會發生一個實例,當多個用戶同時要求一個servlet的時刻,Tomcat會派生出多個線程來履行servlet的代碼,是以servlet是線程不平安的,假如應用欠妥,能夠會湧現成績.上面貼一個例子:
package com.wang.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ThreadSafeServlet extends HttpServlet { private String name;//界說一個公共的公有變量 name public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); //從request域中獲得name屬性 name =request.getParameter("name"); //使線程休眠10秒 try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } //向閱讀器輸入name的值 response.getWriter().print("name="+name); } }
我們在十秒內分離用兩個閱讀器拜訪ThreadSafeServlet?name="zhangSan"和ThreadSafeServlet?name="liSi",顯示的成果均為name=liSi,這就意味著法式湧現了成績,多線程並發的讀寫會招致數據分歧步的成績,所以我們在應用servlet的時刻盡可能不要界說全局的公有屬性,而是把變量分離界說到doGet()和doPost()辦法中去,固然假如僅僅是讀操作,是不會湧現成績的,是以假如要在servlet中界說全局的只讀屬性最好界說為final類型.
Struts2中的Action為每一個要求都創立一個實例,Action和通俗的java類沒有任何差別,不會湧現數據分歧步的情形,是以是線程平安的。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。