<% 
    int aaa = 0; 
    aaa = 3;
    aaa = 4;
    aaa = 5;
    bei_shu = 40;   //注意 ,bei_shu是下面全局区定义的全局变量,而全局变量对应的是servlet的一个成员变量
    out.println("<br>" +  (ff(aaa)));
%><%! 
    int bei_shu=1;
    
     public int ff(int var001)  {
        int bbb = 0;
        int ff = 0;
        bbb = var001 * bei_shu;
        ff = bbb;
        return ff;
    }%> 

解决方案 »

  1.   

        响/应//用/户访/问的函数是_jspService,这个函数本身,每个用户访问对应的线程,是分别调用各自//的_jspService吗?即每个线程分别建立//各自的现场,使用的变//量是_js/pService中/的/制,是吗,如果是/这样,那每个线程有//独//立//的调度现场,相互肯定是不冲突的/,那不/就是/线程安全的?如果不是这样的话,那么——————//1、bei_shu这个全局变量一开始初始化为1,可是在局部变量区被修改为40,函数ff只//有一个参数,该参数肯定是放到堆栈中的,而函数中涉及到全局变量bei/_shu不是/参数,也/就不入堆//栈,存在/同/时被多个线程修改的可能。
    2、tomcat/只要响/应该/用户的访问,那么该变量就要被赋值,最终这个函数到底是不是多线程安全的呢?
    3、某个用户访问//过/程,对应线程A,线程可能只被服务器响//应了一半/刚刚赋值完成,就切换到线/程B去了,线程B重新赋值,
    然//后不等线程B执行完,又切换回来了,这个时候,//变量bei_shu已经//不是线程A///原来设定的值了。然后,接着运行,就出错了/初次发帖,请给予指点,初学者不易啊
      

  2.   

    package org.apache.jsp;import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;public final class test_005ff2_jsp extends org.apache.jasper.runtime.HttpJspBase
        implements org.apache.jasper.runtime.JspSourceDependent { 
        int bei_shu=1;
        
         public int ff(int var001)  {
            int bbb = 0;
            int ff = 0;
            bbb = var001 * bei_shu;
            ff = bbb;
            return ff;
        }
      private static final javax.servlet.jsp.JspFactory _jspxFactory =
              javax.servlet.jsp.JspFactory.getDefaultFactory();  private static java.util.List<java.lang.String> _jspx_dependants;  private javax.el.ExpressionFactory _el_expressionfactory;
      private org.apache.tomcat.InstanceManager _jsp_instancemanager;  public java.util.List<java.lang.String> getDependants() {
        return _jspx_dependants;
      }  public void _jspInit() {
        _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
      }  public void _jspDestroy() {
      }  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
            throws java.io.IOException, javax.servlet.ServletException {    final javax.servlet.jsp.PageContext pageContext;
        javax.servlet.http.HttpSession session = null;
        final javax.servlet.ServletContext application;
        final javax.servlet.ServletConfig config;
        javax.servlet.jsp.JspWriter out = null;
        final java.lang.Object page = this;
        javax.servlet.jsp.JspWriter _jspx_out = null;
        javax.servlet.jsp.PageContext _jspx_page_context = null;
        try {
          response.setContentType("text/html");
          pageContext = _jspxFactory.getPageContext(this, request, response,
           null, true, 8192, true);
          _jspx_page_context = pageContext;
          application = pageContext.getServletContext();
          config = pageContext.getServletConfig();
          session = pageContext.getSession();
          out = pageContext.getOut();
          _jspx_out = out; 
        int aaa = 0; 
        aaa = 3;
        aaa = 4;
        aaa = 5;
        bei_shu = 40;   
        out.println("<br>" +  (ff(aaa)));      out.write("\r\n");
          out.write("\r\n");
          out.write(' ');
          out.write('\r');
          out.write('\n');
        } catch (java.lang.Throwable t) {
          if (!(t instanceof javax.servlet.jsp.SkipPageException)){
            out = _jspx_out;
            if (out != null && out.getBufferSize() != 0)
              try { out.clearBuffer(); } catch (java.io.IOException e) {}
            if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
          }
        } finally {
          _jspxFactory.releasePageContext(_jspx_page_context);
        }
      }
    }
      

  3.   

    以上是对应的tomcat解析该jsp文件的结果
      

  4.   

    这个不会存在多线程安全问题一个Jsp网页触发一个servlet线程,bei_shu这个变量只生存于servlet内部,别的Jsp触发的servlet线程无法访问到它
      

  5.   

    几乎所有的java书籍上说,全局变量是线程不安全的,
    用户A访问的变量可能被用户B的变量给覆盖了,访问的是用户B的变量,这样,业务就错误了。
      

  6.   


      那这个全局变量是定义在一个大的jsp头文件呢?被其它的jsp文件include进来呢?
      

  7.   


    用数据库可以做,用application可以做业务系统中,首先要做是,把干净、真实的用户数据赶快入库。然后考虑其他的
      

  8.   

    就你这个例子而言,这段代码没有线程方面的问题。因为你的全局变量,其实就是个常量。举个其他例子,可能导致线程安全的问题的:test.jsp
    ---------------------------
    <%!int count = 0;%>
    您好,你是第<%=++count%>位访客。
    <% for (int i = 0; i < 100000; i++) { %>
    <!-- 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -->
    <% } %>
    再见,第<%=count%>位访客。test.html
    --------------
    <html>
    <frameset rows="30%,30%,*">
    <frame src="test.jsp" />
    <frame src="test.jsp" />
    <frame src="test.jsp" />
    </frameset>
    </html>
    然后访问test.html,你会发现,同一个页面上面的count可能完全不同。
    比如我生成的3个就是:
    您好,你是第1位访客。 再见,第2位访客。
    您好,你是第2位访客。 再见,第3位访客。
    您好,你是第3位访客。 再见,第3位访客。解决方案,使用局部变量,test.jsp
    ----------
    <%!int count = 0;%>
    <% int myCount = ++count; %>
    您好,你是第<%=myCount%>位访客。
    <% for (int i = 0; i < 100000; i++) { %>
    <!-- 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -->
    <% } %>
    再见,第<%=myCount%>位访客。