1、要分析清楚HTTP请求和xxx变量之间的对应关系:
一个HTTP请求对应一个工作线程;
一个HTTP请求对应一个xxx变量。
如果是这种对应关系,那么xxx变量应该声明为局部变量,即写在service方法中!!而不要声明为实例变量(全局变量,类下面的,不是类下面的方法下面的),它们的生命周期不同,实例变量随实例的生而生,亡而亡;局部变量随着service方法生而生,亡而亡。
显然,这个例子是每个工作线程访问它自己的局部变量,所以有了下边的并发问题。
《Tomcat与javaweb开发技术详解》
2、如果HTTP请求和线程,以及xxx变量的关系如下:
一个HTTP请求对应一个工作线程;
所有HTTP请求对应同一个xxx变量。
那么,此时就用实例变量,而非局部变量!!比如,每一次的求和。在这个例子中,不仅要声明为实例变量,还要使用Java同步机制对多线程同步,使得多线程对xxx实例变量进行同步访问,用synchronized关键字,写成同步代码块就行了。这样,只有当一个工作线程退出同步代码块时,其他线程才允许执行同步代码块,这使得任意时刻不会有两个线程同时操作同一个xxx实例变量,因此就能避免并发问题。